public List <BigInteger> PolyMulMod(BigInteger p, List <BigInteger> a, List <BigInteger> b) { int i, j, k, m = a.Count - 1, n = b.Count - 1, q = m + n; BigInteger ai = 0, bj = 0, sum = 0; List <BigInteger> c = new List <BigInteger>(); for (k = 0; k <= q; k++) { sum = 0; for (i = 0; i <= k; i++) { j = k - i; if (i > m) { ai = 0; } else { ai = a[i]; } if (j > n) { bj = 0; } else { bj = b[j]; } sum = Maths.AddMod(sum, Maths.MulMod(ai, bj, p), p); } c.Add(sum); } return(c); }
public BigInteger Weierstrass(BigInteger x) { BigInteger t3 = BigInteger.ModPow(x, 3, p); BigInteger t1 = Maths.MulMod(a, x, p); BigInteger t2 = Maths.AddMod(t3, t1, p); return(Maths.AddMod(t2, b, p)); }
private BigInteger Horner(BigInteger p, BigInteger x, List <BigInteger> P) { BigInteger s = P[P.Count - 1], t = 0; for (int i = P.Count - 2; i >= 0; i--) { t = Maths.MulMod(s, x, p); s = Maths.AddMod(t, P[i], p); } return(s); }
public static BigInteger GetInverse(BigInteger a, BigInteger m) { BigInteger x, y; BigInteger g = GCD(a, m, out x, out y); BigInteger ret = new BigInteger(); if (g == 1) { ret = Maths.AddMod(x % m, m, m); } else { ret = 0; } return(ret); }
private void Recurse(BigInteger p, List <BigInteger> A, ref List <BigInteger> root) { int count = 0, degreeA = A.Count - 1, degreeB = 0; BigInteger exp = 0, p1 = p - 1, D = 0, a = 0, b = 0, c = 0, e = 0; List <BigInteger> B = null, d = null; List <BigInteger> q = null, r = null, u = null; exp = p1 / 2; if (degreeA != 0) { if (degreeA == 1) { if (A[0] != 0) { a = Maths.GetInverse(A[1], p); b = A[0]; b = -b; b = Maths.MulMod(b, a, p); root.Add(b); } } else if (degreeA == 2) { a = Maths.MulMod(A[1], A[1], p); b = Maths.MulMod(A[0], A[2], p); c = Maths.MulMod(b, 4, p); D = Maths.SubMod(a, c, p); e = hcr.SquareRootModPrime(D, p); BigInteger test = (e * e) % p; if (e == 1) { return; } a = Maths.MulMod(A[2], 2, p); D = Maths.GetInverse(a, p); if (D == 0) { a = -a; a = Maths.AddMod(a, p, p); D = Maths.GetInverse(a, p); } a = Maths.SubMod(e, A[1], p); root.Add(Maths.MulMod(a, D, p)); A[1] = -A[1]; e = -e; a = Maths.AddMod(A[1], e, p); root.Add(Maths.MulMod(a, D, p)); } else { do { count++; a = hcr.RandomRange(0, p1); u = new List <BigInteger>(); u.Add(a); u.Add(1); PolyPowMod(p, exp, u, A, ref d); if (d.Count - 1 != 0) { d[0] = Maths.SubMod(d[0], 1, p); B = PolyGCDMod(p, d, A); if (B.Count == 1 && B[0] == 1) { return; } degreeB = B.Count - 1; } }while (count < 16 && degreeB == 0 || degreeB == degreeA); if (count == 16) { return; } Recurse(p, B, ref root); PolyDivMod(p, A, B, ref q, ref r); Recurse(p, q, ref root); } } }