Sidef
view release on metacpan or search on metacpan
lib/Sidef/Types/Number/Number.pm view on Meta::CPAN
return bless \$x;
}
if ($v == 1) {
my $q = (
HAS_PRIME_UTIL
? Math::Prime::Util::divint($x, $y)
: Math::Prime::Util::GMP::divint($x, $y)
);
return bless \$q;
}
my $q = (
HAS_PRIME_UTIL
? Math::Prime::Util::divint($x, Math::Prime::Util::powint($y, $v))
: Math::Prime::Util::GMP::divint($x, Math::Prime::Util::GMP::powint($y, $v))
);
return bless \$q;
}
$x = _any2mpz($x, 0) // goto &nan;
$y = _any2mpz($y, 1) // goto &nan;
Math::GMPz::Rmpz_cmpabs_ui($y, 1) <= 0 and return $_[0];
my $r = Math::GMPz::Rmpz_init();
Math::GMPz::Rmpz_remove($r, $x, $y);
bless \$r;
}
*remdiv = \&remove;
sub make_coprime {
my ($n, $k) = @_;
_valid(\$k);
$n = _any2mpz($$n, 0) // goto &nan;
$k = _any2mpz($$k, 1) // goto &nan;
if (Math::GMPz::Rmpz_sgn($n) == 0) {
return _set_int($n);
}
my $r = Math::GMPz::Rmpz_init_set($n);
my $g = Math::GMPz::Rmpz_init();
Math::GMPz::Rmpz_gcd($g, $r, $k);
while (Math::GMPz::Rmpz_cmp_ui($g, 1) > 0) {
Math::GMPz::Rmpz_remove($r, $r, $g);
Math::GMPz::Rmpz_gcd($g, $r, $g);
}
bless \$r;
}
sub useed {
my ($n) = @_;
state $_x = require Digest::SHA;
my $z = _any2mpz($$n) // die "[ERROR] Number.useed(): invalid seed value <<$n>> (expected an integer)";
my $hex = Math::GMPz::Rmpz_get_str($z, 16);
$hex = substr($hex, 1) if (substr($hex, 0, 1) eq '-');
my $bin = CORE::pack('H*', $hex);
my $seed = Digest::SHA::sha512($bin);
while (CORE::length($seed) < 1024) {
$seed = Digest::SHA::sha512($seed) . CORE::reverse($seed);
}
Math::Prime::Util::GMP::seed_csprng(1024, $seed);
return Sidef::Types::Bool::Bool::TRUE;
}
*iseed = \&useed;
sub urandomm {
my ($n, $m) = @_;
if (defined($m)) {
_valid(\$m);
$n = $$n;
$m = $$m;
$n = (ref($n) ? _any2mpz($n) : $n) // return ZERO;
$m = (ref($m) ? _any2mpz($m) : $m) // return ZERO;
if (__cmp__($n, $m) > 0) {
($n, $m) = ($m, $n);
}
if (ref($n)) {
$n = _big2uistr($n) // 0;
}
else {
$n >= 0 or do { $n = 0 };
}
if (ref($m)) {
$m = _big2uistr($m) // 0;
}
else {
$m >= 0 or do { $m = 0 };
}
return _set_int(Math::Prime::Util::GMP::urandomr($n, $m) || return ZERO);
}
_set_int(Math::Prime::Util::GMP::urandomm(_big2uistr($$n) || return ZERO) || return ZERO);
}
*urand = \&urandomm;
sub irand {
my ($n, $m) = @_;
( run in 0.622 second using v1.01-cache-2.11-cpan-39bf76dae61 )