| Bill Allombert on Tue, 3 Jun 2003 15:02:16 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| cinvmod |
Hello pari-dev,
Here a patch that add a cinvmod front-end to xgcduu,
similar to cgcd and clcm, that compute the modular inverse
of a mod b.
It could be argued that the name sould be
gcdss, lcmss and invmodss to better fit with the
general naming convention of kernel routine.
Cheers,
Bill.
Index: src/kernel/none/gcdll.c
===================================================================
RCS file: /home/megrez/cvsroot/pari/src/kernel/none/gcdll.c,v
retrieving revision 1.4
diff -u -r1.4 gcdll.c
--- src/kernel/none/gcdll.c 2003/04/22 09:01:02 1.4
+++ src/kernel/none/gcdll.c 2003/06/03 12:57:58
@@ -1049,3 +1049,31 @@
return res;
}
+
+/* x<m */
+ulong uinvmod(ulong x, ulong m)
+{
+ ulong xv,xv1;
+ long s;
+ ulong d=xgcduu(m, x, 1, &xv, &xv1, &s);
+ if (d!=1UL)
+ err(invmoder,"%Z",gmodulss(d,m));
+ xv = xv1 % m; if (s < 0) xv = m - xv;
+ return xv;
+}
+
+long
+cinvmod(long a,long m)
+{
+ m=labs(m);
+ if (a>=0)
+ {
+ if (a>m) a %= m;
+ }
+ else
+ {
+ if (-a>m) a %= m;
+ a+=m;
+ }
+ return ((long)uinvmod((ulong)a, (ulong)m));
+}