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 )