示例#1
0
def equal_degree_splitting(p, d, N=N):
    a = rand_polynomial(p.degree - 1, N=N)
    if not filter_degree(a):
        raise UnluckyStartError

    g1 = gcd_polynomial(a, p, N=N)
    if not equal_polynomial(polynomial((0, 1), N=N), g1, N=N) and g1.degree > 0:

        g1 = mul_polynomial(
            g1, polynomial((0, mul_inv(g1.lc(), N=N)), N=N), N=N
        )
        return g1

    b = exp_polynomial_rem(a, int((N ** d - 1) / 2), p, N=N)
    b.set_coef(0, b.get_coef(0) - 1)

    g2 = extended_euclidean(b, p, N=N)[3]
    if (
        not (
            equal_polynomial(polynomial((0, 1), N=N), g1, N=N)
            or equal_polynomial(p, g2, N=N)
        )
        and g2.degree > 0
    ):
        g2 = mul_polynomial(
            g2, polynomial((0, mul_inv(g2.lc(), N=N)), N=N), N=N
        )
        return g2
    else:
        raise UnluckyStartError
示例#2
0
def iteration(y, num=5):
    """ Aguanta hasta 10 iteraciones"""
    pol = polynomial([fraction(0), fraction(1)])
    for i in range(num):
        pol = pol.recursion(y)
    leadTerm = pol.coef[-1]
    #pol.reduce()
    return pol, leadTerm
 def __init__(self,fname=None):
     if fname:
         fitf = open(fname,"r")
         self.B = [read_polynomial(fitf) for a in range(3)]
     else:
         self.B = [polynomial(3) for a in range(3)]
     self.ll = self.ur = ()
     self.basepath = None
def printRoots(coefficients,roots):
    idx = 0
    for r in roots:
        polyValue = polynomial(coefficients,roots[idx])
        print "(%.2f + %.2fj) = %.2f + %.2fj"%(r.real,r.imag,polyValue.real,polyValue.imag), "    ",
        idx = idx + 1

    print " "
示例#5
0
 def checkFit(self, x):
     self.all_fit = 0
     for i in self.population:
         final = polynomial(x)
         sol = getPolynomial(x, i.a, i.b, i.c, i.d, i.e)
         tmp = abs(final - sol)
         self.all_fit += tmp
         i.setFit(tmp)
     return self.all_fit / self.LENPOPULATION
示例#6
0
 def checkFit(self, x):
     self.all_fit = 0
     for i in self.population:
         final = polynomial(x)
         sol = getPolynomial(x, i.a, i.b, i.c, i.d, i.e)
         tmp = abs(final - sol)
         self.all_fit += tmp
         i.setFit(tmp)
     return self.all_fit / self.LENPOPULATION
示例#7
0
def factorise_polynomial_int_finite(p, N=N):
    h = polynomial(N=N)
    h.set_coef(1, 1)

    v = copy.deepcopy(p)

    i = 0

    # set of factors found
    if v.lc() == 1:
        U = []
    else:
        U = [polynomial((0, v.lc()), N=N)]

    v = mod_polynomial(v, polynomial((0, v.lc()), N=N), N=N)[0]

    v_one = polynomial(N=N)
    v_one.set_coef(0, 1)
    v_zero = polynomial(N=N)

    while not equal_polynomial(v, polynomial((0, 1), N=N), N=N):

        i += 1

        """
		one distinct degree factorisation step
		(removes all factors of degree i)
		"""
        h = exp_polynomial_rem(h, N, p, N=N)
        x = polynomial(N=N)
        x.set_coef(1, 1)
        g = gcd_polynomial(sub_polynomial(h, x, N=N), v, N=N)

        if not equal_polynomial(
            g, polynomial((0, 1), N=N), N=N
        ):  # g.degree > 0:
            """
			call equal degree factorisation algorithm to separate factors fo degree i
			"""
            facs = equal_degree_factorisation(g, i, N=N)

            """
			determine multiplicites of factors found
			"""
            for fac in facs:
                while equal_polynomial(
                    mod_polynomial(v, fac, N=N)[1], v_zero, N=N
                ):
                    U.append(fac)
                    v = mod_polynomial(v, fac, N=N)[0]

    return U
def diagonal_multiterm_test():
    """Check answer is unchanged, for a heap of gradients"""
    for PG in [PG_n(),PG_3He()]:
        BC = BCell()
        BC.ll,BC.ur = (-20,-3.75,-5.1),(20,3.75,5.1)
        BC.B[0] += polynomial(3,{(0,0,0):0.030})
        for i in range(3):
            BC.B[0] += monomial(basisv(3,i),1e-7)
            for j in range(3):
                C = tuple([ int(a==i)+int(a==j) for a in range(3)])
                BC.B[0] += monomial(C,1e-7)
        print PG.name,"1/T2 = %g"%T2i(BC,PG)
def _solvePoly(coefficients, roots, index):
    x = roots[index]
    denominator = complex(1.0,0.0)
    for i in xrange(len(roots)):
        if i==index:
            continue
        denominator *= (x-roots[i])

    if abs(denominator-0)< 0.00001:
        print "WARNING, denominator==0"

    poly = polynomial(coefficients,x)
    return x-(poly/denominator)
示例#10
0
def getPoly(nDims, maxDegree):
    thisRepr = polynomialRepr(nDims,maxDegree)
    thisPoly = polynomial(thisRepr,np.random.rand(thisRepr.nMonoms,)-.5)

    C = np.random.rand(nDims,nDims)-.5
    C = ndot(C,C.T)+np.identity(nDims,nfloat)*.1
    Ci = inv(C)

    x = np.random.rand(nDims,)
    thisPoly.eval(x)
    thisPoly.repr.doLinCoordChange(np.copy(thisPoly.coeffs),Ci)
    
    return thisPoly
示例#11
0
def equal_degree_factorisation(p, d, N=N):

    if p.degree == d:
        p = mod_polynomial(p, polynomial((0, p.lc()), N=N), N=N)[0]
        return [p]
    if p.degree == 0:
        return []
    while True:
        try:
            fac = equal_degree_splitting(p, d, N=N)
            assert fac.degree == d
        except UnluckyStartError:
            continue
        break
    return [
        fac,
        *equal_degree_factorisation(mod_polynomial(p, fac, N=N)[0], d, N=N),
    ]
示例#12
0
def funcEval(nDims, maxDegree):
    thisRepr = polynomialRepr(nDims,maxDegree)
    thisPoly = polynomial(thisRepr, np.random.rand(thisRepr.nMonoms,)-.5)
    
    C = np.random.rand(nDims,nDims)-.5
    C = ndot(C,C.T)+np.identity(nDims, nfloat)*.1
    
    Ci = inv(C)
    
    #Get the lin coord change
    thisPolyTrans = cp(thisPoly)
    thisPolyTrans.coeffs = thisPolyTrans.repr.doLinCoordChange(thisPolyTrans.coeffs, Ci)
    
    
    x = np.random.rand(nDims,)
    y = ndot(C,x.reshape((-1,1)))
    
    print(thisPoly.eval(x))
    print(thisPolyTrans.eval(y.squeeze()))
示例#13
0
def Multifactor_Hensel_Lifting(N, f, a, l, T):
    d = int(np.ceil(np.log(l) / np.log(2)))

    for j in range(1, d + 1, 1):
        N_ = N ** (2 ** j)
        a = (2 * a - lc(f) * a * a) % N_
        T.value = mul_polynomial(polynomial((0, a), N=N_), f, N=N_)

        for node in T.get_walk():
            if not node.isleaf():
                node.L.value, node.R.value, node.s, node.t = Hensel_step(
                    node.value,
                    node.L.value,
                    node.R.value,
                    node.s,
                    node.t,
                    N=N ** (2 ** (j - 1)),
                )

    return a, T
示例#14
0
def funcTestBase(nDims, maxDeg):
    thisRepr = polynomialRepr(nDims, maxDeg)
    thisRelax = lasserreRelax(thisRepr)

    x = np.random.rand(nDims).astype(nfloat)
    print(thisRelax.evalCstr(x))

    print("\n\n")
    print(thisRepr.listOfMonomialsAsInt)
    coeffs = nzeros((thisRepr.nMonoms,),dtype=nfloat)
    coeffs[0] = 1.1
    coeffs[1] = 2.2
    thisPoly = polynomial(thisRepr, coeffs)

    thisPolyCstr = lasserreConstraint(thisRelax, thisPoly)

    print(thisPolyCstr.evalCstr(x))

    
    #print(thisRepr.__dict__)

    return None
示例#15
0
def factor(poly, iterations, eps):
    if (poly.degree() == 1):
        return [fraction(-1) * poly.coef[0] / poly.coef[1]]
    if (poly.degree() == 0):
        return []
    aux = iteration(poly, iterations)[0]
    spCase = 0

    if (aux.coef[0] == fraction(0)):
        spCase = 1
    else:
        root = extractionLostRoot(poly, aux)
        if (abs(poly.evaluate(root)) > eps):
            root = fraction(-1) * root
        #Is it root?
        if (abs(poly.evaluate(root)) > eps):
            spCase = 1

    if (spCase):
        #Complex root or inside M
        prevIteration = iteration(poly, iterations - 1)

        ## Verificar el termino de mayor grado
        if (prevIteration[1].decimal() < 1000):  ###!!
            #And all roots are inside M
            print('### Traslacion')
            return [factor(poly.move(fraction(3)), iterations, eps)]
        else:
            #Complex root
            difIterations = aux - prevIteration[0]
            difIterations.reduce()
            division = poly.divisionPolynomial(difIterations)
            return factor(difIterations, iterations, eps) + [division[0]]
    else:
        newPoly = poly.divisionPolynomial(
            polynomial([fraction(-1) * root, fraction(1)]))
        roots = factor(newPoly[0], iterations, eps)
        return roots + [root]
示例#16
0
    def __init__(self,
                 repr: polynomialRepr,
                 solver: str = 'cvxopt',
                 objective: polynomial = None,
                 firstVarIsOne: bool = True):

        assert solver in ['cvxopt'], 'Solver not supported'
        assert (objective is None) or (repr is objective.repr)

        self.solver = solver
        self.repr = repr
        self.constraints = variableStruct(l=variableStruct(nCstr=0,
                                                           cstrList=[]),
                                          q=variableStruct(nCstr=0,
                                                           cstrList=[]),
                                          s=variableStruct(nCstr=0,
                                                           cstrList=[]),
                                          eq=variableStruct(nCstr=0,
                                                            cstrList=[]))
        self.__objective = polynomial(repr) if objective is None else objective

        self.firstVarIsOne = firstVarIsOne

        self.isUpdate = False
示例#17
0
def poly_from_LF(LF):
    """Re-assemble a linear fitter into a polynomial"""
    P = polynomial(LF.terms[0].N)
    for (n, t) in enumerate(LF.terms):
        P += t * LF.coeffs[n]
    return P
示例#18
0
        else:
            others.append((node_c, 1))

    for i in range(len(others) - 1, 0, -1):
        node_new = factor_tree()
        node_new.set_value(others[i - 1][0], others[i][0], N=N)
        others = others[:-2]
        others.append((node_new, 0))

    return others[0][0]


if __name__ == "__main__":
    from polynomial_fact_finite import *

    p_prob = polynomial()
    p_prob.set_coef(0, 21)
    p_prob.set_coef(1, 20)
    p_prob.set_coef(2, 21)
    p_prob.set_coef(3, 9)
    p_prob.set_coef(4, 15)
    p_prob.set_coef(5, 19)
    p_prob.set_coef(6, 8)
    p_prob.set_coef(7, 9)
    p_prob.set_coef(8, 19)
    p_prob.set_coef(9, 1)
    p_rand = rand_polynomial(10)
    print("random_polynomial: ", p_prob)
    print("factorisation: ")
    facs = factorise_polynomial_int_finite(p_prob)
    for f in facs:
示例#19
0
    return roots + factor(poly, iterations, eps)


#%%


def printRoots(l):
    for i in l:
        if (str(type(i)) == "<class 'list'>"):
            print('?')
            for j in i:
                print(j + fraction(4))
            print('?')
        else:
            print(i)


y = polynomial([fraction(314,100),fraction(1)])*\
    polynomial([fraction(8125,10000),fraction(1)])*\
    polynomial([fraction(431,1000),fraction(1)])*\
    polynomial([fraction(-2391,10000),fraction(1)])

print(y)
y.reduce()
print(y)

#print(factor(y,7,0.1)[0])

for i in range(1, 7):
    print(iteration(y, i)[0])
示例#20
0
    """
    p_prob = polynomial()
    p_prob.set_coef(0, 21)
    p_prob.set_coef(1, 20)
    p_prob.set_coef(2, 21)
    p_prob.set_coef(3, 9)
    p_prob.set_coef(4, 15)
    p_prob.set_coef(5, 19)
    p_prob.set_coef(6, 8)
    p_prob.set_coef(7, 9)
    p_prob.set_coef(8, 19)
    p_prob.set_coef(9, 4)
    p_rand = rand_polynomial(10)
    print("random_polynomial: ", p_prob)
    """
    p_prob = polynomial()
    p_prob.set_coef(0, 2)
    p_prob.set_coef(1, 3)
    p_prob.set_coef(2, 4)
    print("problem_polynomial: ", p_prob)

    N = 13
    l = 8

    a = mul_inv(lc(p_prob), N=N)
    p_norm = mul_polynomial(p_prob, polynomial((0, a), N=N), N=N)
    print("normalised: ", p_norm)

    print("factorisation: ")
    facs = factorise_polynomial_int_finite(p_norm, N=N)
    for f in facs:
示例#21
0
def Hensel_step(f, g, h, s, t, N=N):

    assert isinstance(f, polynomial)
    assert isinstance(g, polynomial)
    assert isinstance(h, polynomial)
    assert isinstance(s, polynomial)
    assert isinstance(t, polynomial)

    assert equal_polynomial(f, mul_polynomial(g, h, N=N), N=N)
    """
    print("s: ",s)
    print("g: ",g)
    print("mul_polynomial(s, g, N=N)",mul_polynomial(s, g, N=N))
    print("t: ",t)
    print("h: ",h)
    print("mul_polynomial(h, t, N=N)", mul_polynomial(h, t, N=N))
    print(add_polynomial(
            mul_polynomial(s, g, N=N), mul_polynomial(h, t, N=N), N=N
        ))
    """
    assert equal_polynomial(
        polynomial((0, 1), N=N),
        add_polynomial(
            mul_polynomial(s, g, N=N), mul_polynomial(h, t, N=N), N=N
        ),
        N=N,
    )

    N_ = N ** 2

    e = sub_polynomial(f, mul_polynomial(g, h, N=N_), N=N_)
    se = mul_polynomial(s, e, N=N_)
    q, r = mod_polynomial(se, h, N=N_)
    g_ = add_polynomial(
        g, mul_polynomial(t, e, N=N_), mul_polynomial(q, g, N=N_), N=N_
    )
    h_ = add_polynomial(h, r, N=N_)

    b = add_polynomial(
        mul_polynomial(s, g_, N=N_),
        mul_polynomial(t, h_, N=N_),
        polynomial((0, -1), N=N_),
        N=N_,
    )
    print("b: ", b)
    sb = mul_polynomial(s, b, N=N_)
    print("sb: ", sb)
    c, d = mod_polynomial(sb, h_, N=N_)
    print("c: ", c)
    print("d: ", d)
    s_ = sub_polynomial(s, d, N=N_)
    print("s_: ", s_)
    t_ = sub_polynomial(
        t,
        add_polynomial(
            mul_polynomial(t, b, N=N_), mul_polynomial(c, g_, N=N_), N=N_
        ),
        N=N_,
    )
    print("t_: ", t_)

    print("f: ", mod_const(f, N_))
    print(
        "mul_polynomial(g_, h_, N=N_): ",
        mod_const(mul_polynomial(g_, h_, N=N_), N_),
    )
    print("s_: ", s_)
    print("g_: ", g_)
    assert equal_polynomial(
        mod_polynomial(mul_polynomial(s_, g_, N=N_), g_, N=N_)[0], s_, N=N_
    )
    print("t_: ", t_)
    print("h_: ", h_)
    assert equal_polynomial(
        mod_polynomial(mul_polynomial(t_, h_, N=N_), h_, N=N_)[0], t_, N=N_
    )

    assert equal_polynomial(f, mul_polynomial(g_, h_, N=N_), N=N_)
    print(
        add_polynomial(
            mul_polynomial(s_, g_, N=N_), mul_polynomial(h_, t_, N=N_), N=N_
        )
    )
    assert equal_polynomial(
        polynomial((0, 1), N=N_),
        add_polynomial(
            mul_polynomial(s_, g_, N=N_), mul_polynomial(h_, t_, N=N_), N=N_
        ),
        N=N_,
    )

    return g_, h_, s_, t_
示例#22
0
def rand_polynomial(max_degree, N=N):
    p = polynomial(N=N)
    for i in range(0, max_degree + 1):
        p.set_coef(i, randint(0, N))
    return p
示例#23
0
def funcTestFirstOpt2(relaxOrder=4):
    thisRepr = polynomialRepr(2, relaxOrder)
    thisRelax = lasserreRelax(thisRepr)
    # x^2+y^2<=1 -> 1.-x^2-y^2>=0.
    # 1,x,y,x**2,xy,y**2
    coeffs = nzeros((thisRepr.nMonoms,), dtype=nfloat)
    coeffs[0] = 1.
    coeffs[3] = -1.
    coeffs[5] = -1.
    thisPoly = polynomial(thisRepr, coeffs)
    thisPolyCstr = lasserreConstraint(thisRelax, thisPoly)

    # objective 1 : convex
    # obj = (1+x)^2 + (1+y)^2
    coeffs = nzeros((thisRepr.nMonoms,), dtype=nfloat)
    coeffs[0] = 1.
    coeffs[1] = 1.
    obj1 = polynomial(thisRepr, np.copy(coeffs))
    coeffs = nzeros((thisRepr.nMonoms,), dtype=nfloat)
    coeffs[0] = 1.
    coeffs[2] = 1.
    obj2 = polynomial(thisRepr, np.copy(coeffs))
    
    obj = obj1**2+obj2**2
    
    thisOpt = convexProg(thisRepr, objective=obj)
    
    thisOpt.addCstr(thisRelax)
    sol = thisOpt.solve()
    print("Analytic solution is 0. obtained {0}".format(sol['primal objective']))
    print("Analytic minimizer is (-1,-1) obtained {0}".format(sol['x_np'][0, 1:3]))
    print("relax mat is \n {0}".format(thisRelax.evalCstr(sol['x_np'])))
    print("With eigvals \n {0} \n and eigvec \n{1}".format(*eigh(thisRelax.evalCstr(sol['x_np']))))
    print("Delta constraints is \n {0}".format(thisRelax.evalCstr(sol['x_np'])-thisRelax.evalCstr(narray([-1., -1.], dtype=nfloat))))
    print("With eigvals \n {0} \n and eigvec \n {1}".format(*eigh(thisRelax.evalCstr(sol['x_np'])-thisRelax.evalCstr(narray([-1., -1.], dtype=nfloat)))))
    
    thisOpt.addCstr(thisPolyCstr)
    sol = thisOpt.solve()
    Osq2 = -1./2.**0.5
    print("Analytic solution is 0.17157287525381 obtained {0}".format(sol['primal objective']))
    print("Analytic minimizer is (-1/sq2,-1/sq2) obtained {0}".format(sol['x_np'][0, 1:3]))
    print("relax mat is \n {0}".format(thisRelax.evalCstr(sol['x_np'])))
    print("With eigvals \n {0} \n and eigvec \n{1}".format(*eigh(thisRelax.evalCstr(sol['x_np']))))
    print("Delta constraints is \n {0}".format(thisRelax.evalCstr(sol['x_np'])-thisRelax.evalCstr(narray([Osq2, Osq2], dtype=nfloat))))
    print("With eigvals \n {0} \n and eigvec \n {1}".format(*eigh(thisRelax.evalCstr(sol['x_np'])-thisRelax.evalCstr(narray([Osq2, Osq2], dtype=nfloat)))))
    
    obj2 = -obj
    thisOpt.removeCstr('s', 1)
    thisOpt.objective = obj2
    sol = thisOpt.solve()
    print("Solution should be unbounded")
    print(sol)
    
    thisOpt.addCstr(thisPolyCstr)
    sol = thisOpt.solve()
    Osq2 = 1./2.**0.5
    print("Analytic solution is -5.82842712474619 obtained {0}".format(sol['primal objective']))
    print("Analytic minimizer is (1/sq2,1/sq2) obtained {0}".format(sol['x_np'][0, 1:3]))
    print("relax mat is \n {0}".format(thisRelax.evalCstr(sol['x_np'])))
    print("With eigvals \n {0} \n and eigvec \n{1}".format(*eigh(thisRelax.evalCstr(sol['x_np']))))
    print("Delta constraints is \n {0}".format(thisRelax.evalCstr(sol['x_np'])-thisRelax.evalCstr(narray([Osq2, Osq2], dtype=nfloat))))
    print("With eigvals \n {0} \n and eigvec \n {1}".format(*eigh(thisRelax.evalCstr(sol['x_np'])-thisRelax.evalCstr(narray([Osq2, Osq2], dtype=nfloat)))))
示例#24
0
                )
                break
    G.add(f_)

    return G


if __name__ == "__main__":

    # create logger
    logger = logging.getLogger("polynomial_fact_q")
    logger.setLevel(logging.DEBUG)
    # create console handler and set level to debug
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    # create formatter
    formatter = logging.Formatter("%(name)s - %(levelname)s - %(message)s")
    # add formatter to ch
    ch.setFormatter(formatter)
    # add ch to logger
    logger.addHandler(ch)

    p = polynomial((1, 3))
    p.set_coef(2, 4)
    p.set_coef(0, 2)
    print("p: ", p)
    r = poly_fact_z(p)
    print("return: ")
    for f in r:
        print(f)
示例#25
0
def vec_2_poly(v, N=N):
    assert isinstance(v, vector)
    p_ = polynomial(N=N)
    for i in range(v.shape[0]):
        p_.set_coef(i, v.val[i])
    return p_
def poly_from_LF(LF):
    """Re-assemble a linear fitter into a polynomial"""
    P = polynomial(LF.terms[0].N)
    for (n,t) in enumerate(LF.terms):
        P += t*LF.coeffs[n]
    return P
示例#27
0
    while (poly.degree() > 1 and abs(poly.evaluate(fraction(0))) < 0.0001):
        poly.coef = poly.coef[1:]
        roots.append(fraction(0))
    #we get a polynomial without 0 as root
    return roots + factor(poly, iterations, eps)


#%%


def printRoots(l):
    for i in l:
        if (str(type(i)) == "<class 'list'>"):
            print('?')
            for j in i:
                print(j + fraction(4))
            print('?')
        else:
            print(i)


y = polynomial([fraction(-1, 2), fraction(1, 2), fraction(1, 2), fraction(1)])
y = y.move(fraction(3))
y.reduce()
print(y)

#print(factor(y,7,0.1)[0])

for i in range(1, 7):
    print(iteration(y, i)[0])
示例#28
0
def poly_fact_z(f):
    assert isinstance(f, polynomial)
    assert f.degree > 0

    output = set()
    logger.debug("poly_fact_z called")

    # 1
    if f.degree == 1:
        output.add(f)
        return output
    b = f.lc()
    A = f.max_norm()
    n = f.degree
    B = ((n + 1) ** 0.5) * (2 ** n) * A
    C = ((n + 1) ** (2 * n)) * (A ** (2 * n - 1))
    y = np.ceil(2 * (np.log(C) / np.log(2)))

    logger.debug("#1 completed")

    # 2
    prime = gen_primes()

    while True:
        p = next(prime)
        f_bar = mod_const(f, p)
        while not (
            b % p != 0
            and gcd_polynomial(
                f_bar, mod_const(deriv_polynomial(f_bar), p), N=p
            ).degree
            == 0
        ):  # equal_polynomial(gcd_polynomial(f_bar,mod_const(deriv_polynomial(f_bar),p),N=p),polynomial((0,1)),N=p))):
            p = next(prime)
            f_bar = mod_const(f, p)
            assert p <= 2 * y * np.log(y)
        l = np.ceil(np.log(2 ** (n ** 2) * B ** (2 * n)) / np.log(p))
        print("l: ", l)

        i = 0
        """
        while l >= 2 ** i:
            i += 1
        l = 2 ** i
        print("l: ",l)
        """

        logger.debug("#2 completed: possible p={}".format(p))

        # 3
        b_inv_poly = polynomial((0, mul_inv(b, N=p)), N=p)
        f_lc = mul_polynomial(f, b_inv_poly, N=p)

        i = 0
        while i < 100:
            i += 1

            h_list = factorise_polynomial_int_finite(f_lc, N=p)
            cond = True
            for h in h_list:
                if h.max_norm() > (p / 2):
                    cond = False
            if not cond:
                continue

        if cond:
            break

    b_poly = polynomial((0, b), N=p)
    facs = [b_poly] + h_list
    assert equal_polynomial(mul_polynomial(*facs, N=p), f, N=p)

    logger.debug("#3 completed: factors:")
    for h in facs:
        logger.debug(h)

    # 4
    f_tree = make_tree(h_list, N=p)
    _, f_tree = Multifactor_Hensel_Lifting(p, f, mul_inv(b, N=p), l, f_tree)
    g = [t.value for t in f_tree.get_leaves()]
    for gi, hi in zip(g, h_list):
        print("p: ", p)
        print(gi)
        print(hi)
        assert equal_polynomial(gi, hi, N=p)
        assert gi.max_norm() < p ** l / 2

    logger.debug("#4 completed")

    # 5
    T = set(range(len(h_list)))
    G = set()
    f_ = copy.deepcopy(f)

    logger.debug("#5 completed")
    logger.debug("#6 completed")

    # 6
    while len(T) > 0:

        # 7
        u = h_list[max(T, key=lambda p: h_list[p].degree)]
        d = u.degree
        n_ = f_.degree

        for i in T:
            print(h_list[i])
        logger.debug("#7 completed")

        for j in range(d + 1, n_ + 1):
            # 8
            basis_ = basis(N=j)
            c = 0
            x_poly = polynomial((0, 1), N=p ** (l + 1))
            for k in range(0, (j - d)):
                new_poly = mul_polynomial(u, x_poly, N=p ** (l + 1))
                new_vec = poly_2_vec(new_poly, j)
                basis_.set_vec(k, new_vec)
                x_poly = mul_polynomial(
                    x_poly, polynomial((1, 1), N=p ** (l + 1)), N=p ** (l + 1)
                )
            p_poly = polynomial((0, p ** l), N=p ** (l + 1))
            for k in range((j - d), j):
                new_vec = poly_2_vec(p_poly, j)
                basis_.set_vec(k, new_vec)
                p_poly = mul_polynomial(
                    p_poly, polynomial((1, 1), N=p ** (l + 1)), N=p ** (l + 1)
                )

            g_vec = basis_reduction(basis_).get_vec(0)
            g_ = vec_2_poly(g_vec)

            logger.debug(
                "#8 completed: {} of {}: g*={}".format((j - d), (n_ - d), g_)
            )

            # 9
            h_ = polynomial((0, b), N=p ** l)
            for i in T:
                S = set()
                if equal_polynomial(
                    mod_polynomial(g_, h_list[i], N=p)[1], polynomial(N=p), N=p
                ):
                    S.add(i)
                else:

                    h_ = mul_polynomial(h_, g[i], N=p ** l)

            assert h_.max_norm() < ((p ** l) / 2)
            if g_.pp().one_norm() * h_.pp().one_norm() <= B:
                for i in S:
                    print("S: ", h_list[i])
                T = T - S
                G.add(g_.pp())
                f_ = h_.pp()
                b = f_.lc()
                logger.debug(
                    "#9 completed: {} of {}: g*={}".format(
                        (j - d), (n_ - d), g_
                    )
                )
                break
    G.add(f_)

    return G
示例#29
0
            """
			determine multiplicites of factors found
			"""
            for fac in facs:
                while equal_polynomial(
                    mod_polynomial(v, fac, N=N)[1], v_zero, N=N
                ):
                    U.append(fac)
                    v = mod_polynomial(v, fac, N=N)[0]

    return U


if __name__ == "__main__":

    p_prob = polynomial(N=29)
    p_prob.set_coef(0, 15)
    p_prob.set_coef(1, 8)
    p_prob.set_coef(2, 1)
    p3 = polynomial()
    p3.set_coef(0, 2)
    p3.set_coef(1, 3)
    p3.set_coef(2, 1)
    p4 = polynomial()
    p4.set_coef(0, 1)
    p4.set_coef(1, 3)
    p4.set_coef(2, 3)
    p4.set_coef(3, 1)
    # print("p3:", p3)
    p_rand = rand_polynomial(6)
    print("random_polynomial: ", p_prob)
示例#30
0
def Hensel_step(f, g, h, s, t, N=N):

    assert isinstance(f, polynomial)
    assert isinstance(g, polynomial)
    assert isinstance(h, polynomial)
    assert isinstance(s, polynomial)
    assert isinstance(t, polynomial)

    assert equal_polynomial(f, mul_polynomial(g, h, N=N), N=N)
    """
    print("s: ",s)
    print("g: ",g)
    print("mul_polynomial(s, g, N=N)",mul_polynomial(s, g, N=N))
    print("t: ",t)
    print("h: ",h)
    print("mul_polynomial(h, t, N=N)", mul_polynomial(h, t, N=N))
    print(add_polynomial(
            mul_polynomial(s, g, N=N), mul_polynomial(h, t, N=N), N=N
        ))
    """
    assert equal_polynomial(
        polynomial((0, 1), N=N),
        add_polynomial(mul_polynomial(s, g, N=N),
                       mul_polynomial(h, t, N=N),
                       N=N),
        N=N,
    )

    N_ = N**2

    e = sub_polynomial(f, mul_polynomial(g, h, N=N_), N=N_)
    se = mul_polynomial(s, e, N=N_)
    q, r = mod_polynomial(se, h, N=N_)
    g_ = add_polynomial(g,
                        mul_polynomial(t, e, N=N_),
                        mul_polynomial(q, g, N=N_),
                        N=N_)
    h_ = add_polynomial(h, r, N=N_)

    b = add_polynomial(
        mul_polynomial(s, g_, N=N_),
        mul_polynomial(t, h_, N=N_),
        polynomial((0, -1), N=N_),
        N=N_,
    )
    sb = mul_polynomial(s, b, N=N_)
    c, d = mod_polynomial(sb, h_, N=N_)
    s_ = sub_polynomial(s, d, N=N_)
    t_ = sub_polynomial(
        t,
        add_polynomial(mul_polynomial(t, b, N=N_),
                       mul_polynomial(c, g_, N=N_),
                       N=N_),
        N=N_,
    )

    assert equal_polynomial(f, mul_polynomial(g_, h_, N=N_), N=N_)
    assert equal_polynomial(
        polynomial((0, 1), N=N_),
        add_polynomial(mul_polynomial(s_, g_, N=N_),
                       mul_polynomial(h_, t_, N=N_),
                       N=N_),
        N=N_,
    )

    return g_, h_, s_, t_