def test_reduceToNFp(self): p = 9923 poly1 = poly.Poly([7301,1477,7726]) poly2 = poly.Poly([8,29,15,1]) NFp = poly.NumberFieldModP(poly1,p) testReduction = NFp(poly2) correctReduction = NFp(poly.Poly([9858, 7744])) self.assertEqual(testReduction,correctReduction)
def test_numberfield_sqrt_equality(self): nfspoly = poly.Poly([8,29,15,1]) prime = 9929 NFp = poly.NumberFieldModP(nfspoly,prime) posSqrt = NFp(poly.Poly([3077, 1160, 3402])) negSqrt = NFp(poly.Poly([6852, 8769, 6527])) self.assertEqual(posSqrt,-negSqrt) self.assertEqual(-posSqrt,negSqrt)
def test_numberfield_power_modp2(self): #Briggs polynomial = poly.Poly([8,29,15,1]) p = 9923 NFp = poly.NumberFieldModP(polynomial,p) g = NFp(poly.Poly([0,1])) ** p g = g - NFp(poly.Poly([0,1])) g = g.getPoly() correctG = poly.Poly([7301,1477,7726]) self.assertEqual(g,correctG)
def test_numberfield_modp1(self): # Briggs' example nfspoly = poly.Poly([8,29,15,1]) NFp = poly.NumberFieldModP(nfspoly,9929) nfspolyd = NFp(nfspoly.derivative()) correctProduct = NFp(poly.Poly([6659,3891,2027])) tomult = [[-1,1],[3,1],[13,1],[104,1],[3,2],[25,2],[-8,3],[48,5],[54,5],[-43,6],[-8,7],[11,7],[856,11]] tomult = [NFp(poly.Poly(x)) for x in tomult] prod = multAllElements(NFp(poly.Poly([1])),tomult) prod = prod * nfspolyd * nfspolyd self.assertEqual(prod,correctProduct)
def test_numberfield_sqrt_modp2(self): # Briggs nfspoly = poly.Poly([161, 134, 2, 1]) primes = [2305843009213693951,2305843009213693967,2305843009213693973,2305843009213694381] tomult = [[-92,-1],[-57,-1],[-23,-1],[-8,-1],[-7,-1],[2,-1],[10,-1],[17,-1],[29,-1],[35,-1],[84,-1],[115,-1],[139,-1],[-5,-2],[19,-2],[69,-2],[93,-2],[119,-2],[-542,-3],[-28,-3],[-23,-3],[-8,-3]] for prime in primes: NFp = poly.NumberFieldModP(nfspoly,prime) tomultNFp = [NFp(poly.Poly(x)) for x in tomult] nfspolyd = NFp(nfspoly.derivative()) prod = multAllElements(NFp(poly.Poly([1])),tomultNFp) prod = prod * nfspolyd * nfspolyd sqrt = prod.sqrt() self.assertEqual(sqrt*sqrt,prod)
def test_numberfield_modp3(self): # again, for a different prime nfspoly = poly.Poly([161, 134, 2, 1]) NFp = poly.NumberFieldModP(nfspoly,2305843009213693973) nfspolyd = NFp(nfspoly.derivative()) tomult = [[-92,-1],[-57,-1],[-23,-1],[-8,-1],[-7,-1],[2,-1],[10,-1],[17,-1],[29,-1],[35,-1],[84,-1],[115,-1],[139,-1],[-5,-2],[19,-2],[69,-2],[93,-2],[119,-2],[-542,-3],[-28,-3],[-23,-3],[-8,-3]] tomult = [NFp(poly.Poly(x)) for x in tomult] sqrt = NFp(poly.Poly([2053587909481112245, 481917539782027120, 1681812579256330563])) correctProduct = sqrt * sqrt prod = multAllElements(NFp(poly.Poly([1])),tomult) prod = prod * nfspolyd * nfspolyd self.assertEqual(prod,correctProduct)
def test_numberfield_sqrt_modp1(self): # Briggs nfspoly = poly.Poly([8,29,15,1]) primes = [9851,9907,9929] tomult = [[-1,1],[3,1],[13,1],[104,1],[3,2],[25,2],[-8,3],[48,5],[54,5],[-43,6],[-8,7],[11,7],[856,11]] for prime in primes: NFp = poly.NumberFieldModP(nfspoly,prime) tomultNFp = [NFp(poly.Poly(x)) for x in tomult] nfspolyd = NFp(nfspoly.derivative()) prod = multAllElements(NFp(poly.Poly([1])),tomultNFp) prod = prod * nfspolyd * nfspolyd sqrt = prod.sqrt() self.assertEqual(sqrt*sqrt,prod)
def test_numberfield_modp2(self): # Spaans' examples nfspoly = poly.Poly([161, 134, 2, 1]) NFp = poly.NumberFieldModP(nfspoly,2305843009213693951) nfspolyd = NFp(nfspoly.derivative()) tomult = [[-92,-1],[-57,-1],[-23,-1],[-8,-1],[-7,-1],[2,-1],[10,-1],[17,-1],[29,-1],[35,-1],[84,-1],[115,-1],[139,-1],[-5,-2],[19,-2],[69,-2],[93,-2],[119,-2],[-542,-3],[-28,-3],[-23,-3],[-8,-3]] tomult = [NFp(poly.Poly(x)) for x in tomult] # Spaans provides the sqrt, so square that. sqrt = NFp(poly.Poly([2053587909481111827,481917539782026790,1681812579256330563])) correctProduct = sqrt * sqrt prod = multAllElements(NFp(poly.Poly([1])),tomult) prod = prod * nfspolyd * nfspolyd self.assertEqual(prod,correctProduct)
def test_numberfield_power_modp1(self): # Briggs nfspoly = poly.Poly([8,29,15,1]) NFp = poly.NumberFieldModP(nfspoly,9929) base = NFp(poly.Poly([6659,3891,2027])) s = 122356359011 power = base ** s self.assertEqual(power,NFp(poly.Poly([9928]))) power = base ** ((s+1)/2) prod = power * NFp(poly.Poly([7827])) self.assertEqual(prod,NFp(poly.Poly([3077,1160,3402]))) base = NFp(poly.Poly([1,1])) power = base ** (2*s) self.assertEqual(power,NFp(poly.Poly([2102])))
def test_numberfield_positivesquareroot_modp1(self): # Briggs' CRT example n = 45113 m = 31 nfspoly = poly.Poly([8,29,15,1]) tomult = [[-1,1],[3,1],[13,1],[104,1],[3,2],[25,2],[-8,3],[48,5],[54,5],[-43,6],[-8,7],[11,7],[856,11]] primeSizeEst = etcmath.calcRequiredPrimeLength(n, m, nfspoly, tomult) #primes = randomPrimes(primeSizeEst,32) prime = 9929 NFp = poly.NumberFieldModP(nfspoly,prime) nfspolyd = NFp(nfspoly.derivative()) tomultNFp = [NFp(poly.Poly(x)) for x in tomult] prod = multAllElements(NFp(poly.Poly([1])),tomultNFp) prod = prod * nfspolyd * nfspolyd sqrt = prod.sqrt() posSqrt = NFp(poly.Poly([3077, 1160, 3402])) negSqrt = NFp(poly.Poly([6852, 8769, 6527])) self.assertTrue(sqrt == posSqrt or sqrt == negSqrt)
print "dependency has %s entries." % len(dependencySmooths) primeExponents = getRatPrimeExponents(dependencySmooths, rfBase) ratSide = getSqrtModNFromPrimeExponents(primeExponents, rfBase, n) ratSide = (ratSide * nfsPolyDerivative.evaluate(m)) % n couvBound = etcmath.calcRequiredPrimeLength(n, m, poly.Poly(nfsPoly), dependencySmooths) (primes, prodPrimes) = generatePrimes(primes, poly.Poly(nfsPoly), couvBound) primeExponents = getAlgPrimeExponents(dependencySmooths, NF, afBase) sum = 0 for prime in primes: print "%s/%s sqrt" % (primes.index(prime) + 1, len(primes)) NFp = poly.NumberFieldModP(poly.Poly(nfsPoly), prime) normModP = getSqrtModNFromPrimeExponents(primeExponents, afBase, prime) normModP = (normModP * NFp(nfsPolyDerivative).norm()) % prime prod = NFp(poly.Poly([1])) for smooth in dependencySmooths: prod = prod * NFp(poly.Poly(smooth)) prod = prod * (NFp(nfsPolyDerivative)**2) sqrt = prod.sqrt() if (sqrt.norm() != normModP): sqrt = -sqrt if (sqrt.norm() != normModP):