[libmath-prime-util-perl] 128/181: First cut znlog
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:51:14 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.36
in repository libmath-prime-util-perl.
commit 9c98f1b2182b5d81873ffe85175805aa6cd13f50
Author: Dana Jacobsen <dana at acm.org>
Date: Tue Jan 7 01:42:29 2014 -0800
First cut znlog
---
XS.xs | 19 ++++++++++++++++++-
lib/Math/Prime/Util.pm | 2 +-
util.c | 12 ++++++++++++
util.h | 1 +
4 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/XS.xs b/XS.xs
index 68c729f..2868381 100644
--- a/XS.xs
+++ b/XS.xs
@@ -115,7 +115,8 @@ static int _validate_int(pTHX_ SV* n, int negok)
}
if (SvROK(n)) {
if (sv_isa(n, "Math::BigInt") || sv_isa(n, "Math::BigFloat") ||
- sv_isa(n, "Math::GMP") || sv_isa(n, "Math::GMPz") )
+ sv_isa(n, "Math::Pari") || sv_isa(n, "Math::GMP") ||
+ sv_isa(n, "Math::GMPz") )
isbignum = 1;
else
return 0;
@@ -668,6 +669,22 @@ znorder(IN SV* sva, IN SV* svn)
return; /* skip implicit PUTBACK */
void
+znlog(IN SV* sva, IN SV* svg, IN SV* svp)
+ PREINIT:
+ int astatus, gstatus, pstatus;
+ PPCODE:
+ astatus = _validate_int(aTHX_ sva, 0);
+ gstatus = _validate_int(aTHX_ svg, 0);
+ pstatus = _validate_int(aTHX_ svp, 0);
+ if (astatus == 1 && gstatus == 1 && pstatus == 1) {
+ UV ret = znlog(my_svuv(sva), my_svuv(svg), my_svuv(svp));
+ if (ret == 0) XSRETURN_UNDEF;
+ XSRETURN_UV(ret);
+ }
+ _vcallsub("PP::znlog");
+ return; /* skip implicit PUTBACK */
+
+void
kronecker(IN SV* sva, IN SV* svb)
PREINIT:
int astatus, bstatus, abpositive, abnegative;
diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index 906fcd6..330c5fb 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -42,7 +42,7 @@ our @EXPORT_OK =
partitions
chebyshev_theta chebyshev_psi
divisor_sum
- carmichael_lambda kronecker znorder znprimroot legendre_phi
+ carmichael_lambda kronecker znorder znprimroot znlog legendre_phi
ExponentialIntegral LogarithmicIntegral RiemannZeta RiemannR
);
our %EXPORT_TAGS = (all => [ @EXPORT_OK ]);
diff --git a/util.c b/util.c
index 6d1f225..b81cb66 100644
--- a/util.c
+++ b/util.c
@@ -1058,6 +1058,18 @@ UV znprimroot(UV n) {
return 0;
}
+/* Find smallest n where a = g^n mod p */
+/* This implementation is just a stupid placeholder. */
+UV znlog(UV a, UV g, UV p) {
+ UV t, n = 1;
+ if (a == 0 || g == 0 || p < 2) return 0;
+ for (n = 1; n < p; n++) {
+ t = powmod(g, n, p);
+ if (t == a)
+ return n;
+ }
+ return 0;
+}
double _XS_chebyshev_theta(UV n)
{
diff --git a/util.h b/util.h
index 3c048df..7c71493 100644
--- a/util.h
+++ b/util.h
@@ -37,6 +37,7 @@ extern UV exp_mangoldt(UV n);
extern UV carmichael_lambda(UV n);
extern UV znprimroot(UV n);
extern UV znorder(UV a, UV n);
+extern UV znlog(UV a, UV g, UV p);
/* Above this value, is_prime will do deterministic Miller-Rabin */
/* With 64-bit math, we can do much faster mulmods from 2^16-2^32 */
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libmath-prime-util-perl.git
More information about the Pkg-perl-cvs-commits
mailing list