Ejemplo n.º 1
0
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]
Ejemplo n.º 2
0
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]
Ejemplo n.º 3
0
	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)
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
def chinese_rem(a, b, p, q):
    return (a * q * etcmath.modInv(q, p) + b * p * etcmath.modInv(p, q)) % (p *
                                                                            q)
Ejemplo n.º 6
0
def chinese_rem(a,b,p,q):
	return (a*q*etcmath.modInv(q,p) + b*p*etcmath.modInv(p,q)) % (p*q)