def find_sublattice_basis(basis_q, p, r): (a0, b0, a1, b1) = frankefy(basis_q) j = 0 while (True): j += 1 #print "%s mod %s" % (a0+r*b0,p) if ((a0 + r * b0) % p == 0 or j > p): return False i = (-j * etcmath.modInv(a0 + r * b0, p) * (a1 + r * b1)) % p if (i == 0 or j == 0): continue basis1 = [i, j] break while (True): j += 1 i = (-j * etcmath.modInv(a0 + r * b0, p) * (a1 + r * b1)) % p if (i == 0 or j == 0): continue if (float(basis1[0]) / i - float(basis1[1]) / j < 0.01): continue basis2 = [i, j] break return [basis1, basis2]
def find_sublattice_basis(basis_q,p,r): (a0,b0,a1,b1) = frankefy(basis_q) j = 0 while(True): j += 1 #print "%s mod %s" % (a0+r*b0,p) if((a0+r*b0) % p == 0 or j > p): return False i = (-j*etcmath.modInv(a0+r*b0,p)*(a1+r*b1)) % p if(i == 0 or j == 0): continue basis1 = [i,j] break while(True): j += 1 i = (-j*etcmath.modInv(a0+r*b0,p)*(a1+r*b1)) % p if(i == 0 or j == 0): continue if(float(basis1[0])/i - float(basis1[1])/j < 0.01): continue basis2 = [i,j] break return [basis1,basis2]
def modcoeffs(self,p): coeffs = [0]*len(self.coeffs) for i in range(len(self.coeffs)): if(type(self.coeffs[i]) == fractions.Fraction): coeffs[i] = etcmath.modInv(self.coeffs[i].denominator,p)*self.coeffs[i].numerator % p else: coeffs[i] = self.coeffs[i] % p return Poly(coeffs)
def rootsRecurse(g,p): if(g.degree() == 2): return etcmath.qe_mod(g.coeffs[2],g.coeffs[1],g.coeffs[0],p) elif(g.degree() == 1): return [(-g.coeffs[0]*etcmath.modInv(g.coeffs[1],p)) % p] elif(g.degree() == 0): return [] roots = [] h = Poly([1]) NFp = NumberFieldModP(g,p) while(h.degree() == 0 or g == h): a = random.randint(0,p) base = NFp(Poly([a,1])) base = base ** ((p-1)/2) toGCD = base - NFp(Poly([1])) h = polynomialGCDModP(toGCD.getPoly(),g,p) roots.extend(rootsRecurse(h,p)) dividedPoly = NFp(g/h).getPoly() roots.extend(rootsRecurse(dividedPoly,p)) return roots
def chinese_rem(a, b, p, q): return (a * q * etcmath.modInv(q, p) + b * p * etcmath.modInv(p, q)) % (p * q)
def chinese_rem(a,b,p,q): return (a*q*etcmath.modInv(q,p) + b*p*etcmath.modInv(p,q)) % (p*q)