示例#1
0
 def testInit(self):
     self.assertEqual("2/1", str(Rational(2)))
     self.assertEqual("2/1", str(Rational(2)))
     self.assertEqual("1/2", str(Rational(1,2)))
     self.assertEqual("1/2", str(Rational(Rational(1,2))))
     self.assertEqual("21/26", str(Rational(Rational(7,13),Rational(2,3))))
     self.assertEqual("3/2", str(Rational(1.5)))
     self.assertEqual("3/4", str(Rational(1.5, 2.0)))
     self.assertRaises(ZeroDivisionError, Rational, 1, 0)
     self.assertRaises(TypeError, Rational, 1, finitefield.FinitePrimeFieldElement(1,7))
     self.assertRaises(TypeError, Rational, finitefield.FinitePrimeFieldElement(1,7), 4)
示例#2
0
def _pull_back(elem, p):
    """
    Return an integer which is a pull back of elem in Fp.
    """
    if not isinstance(elem, finitefield.FinitePrimeFieldElement):
        if isinstance(elem, intresidue.IntegerResidueClass):
            # expecting Z/(p^2 Z)
            result = finitefield.FinitePrimeFieldElement(elem.n, p).n
        else:
            # expecting Z or Q
            result = finitefield.FinitePrimeFieldElement(elem, p).n
    else:
        result = elem.n
    if result > (p >> 1): # minimum absolute
        result -= p
    return result
示例#3
0
    def testWeilPairing(self):
        # this example was refered to Washington.
        e = elliptic.EC([0, 2], 7)
        P = [5, 1]
        Q = [0, 3]
        R = e.WeilPairing(3, P, Q)
        self.assertEqual(finitefield.FinitePrimeFieldElement(2, 7), R)

        # test case of extension field, characteristic 7
        p = 7
        r = 11
        F = finitefield.FinitePrimeField(p)
        PX = uniutil.polynomial({0:3,1:3,2:2,3:1,4:4,5:1,6:1,10:1},F)
        Fx = finitefield.FiniteExtendedField(p,PX)

        E = elliptic.EC([F.one,-F.one],F)
        Ex = elliptic.EC([Fx.one,-Fx.one],Fx)

        P = [3,6]
        assert E.whetherOn(P)
        assert Ex.whetherOn(P)
        assert E.mul(11,P) == E.infpoint
        Qxcoord = Fx.createElement(6*7**9+7**8+7**6+6*7**3+6*7**2+7+6)
        Qycoord = Fx.createElement(3*7**9+6*7**8+4*7**7+2*7**6+5*7**4+5*7**3+7**2+7+3)
        Q = [Qxcoord,Qycoord]
        assert Ex.whetherOn(Q)
        assert Ex.mul(11,Q) == Ex.infpoint

        w = Ex.WeilPairing(11, P, Q)
        Wp = Fx.createElement(7**9 + 5*7**8 + 4*7**7 + 2*7**5 + 7**4 + 6*7**2)
        assert w == Wp
示例#4
0
def _mod_p(poly, p):
    """
    Return modulo p reduction of given integer coefficient polynomial.
    """
    coeff = {}
    for d, c in poly:
        coeff[d] = finitefield.FinitePrimeFieldElement(c, p)
    return uniutil.polynomial(poly, finitefield.FinitePrimeField.getInstance(p))
示例#5
0
 def testTatePairing_Extend(self):
     # this example was refered to Kim Nguyen.
     e = elliptic.EC([0, 4], 997)
     P = [0, 2]
     Q = [747, 776]
     R = e.TatePairing_Extend(3, P, P)
     W1 = e.TatePairing_Extend(3, P, Q)
     W2 = e.TatePairing_Extend(3, Q, P)
     self.assertEqual(e.basefield.one, R)
     self.assertEqual(finitefield.FinitePrimeFieldElement(304, 997), W1)
     self.assertEqual(W1, W2.inverse())
def _kernel_of_qpow(basis_matrix, q, p, field):
    """
    compute kernel of w^q.
    (this method is same as round2._kernel_of_qpow)
    """
    omega = _matrix_to_algnumber_list(basis_matrix, field)
    omega_pow = []
    for omega_i in omega:
        omega_pow.append(omega_i ** q)
    omega_pow_mat = _algnumber_list_to_matrix(omega_pow, field)
    A_over_Z = basis_matrix.inverse(omega_pow_mat) #theta repr -> omega repr
    A = A_over_Z.map(
         lambda x: finitefield.FinitePrimeFieldElement(x.numerator, p))
    return A.kernel()
示例#7
0
def e3_Fp(x, p):
    """
    p is prime
    0 = x[0] + x[1]*t + x[2]*t**2 + x[3]*t**3
    """
    x.reverse()
    lc_inv = finitefield.FinitePrimeFieldElement(x[0], p).inverse()
    coeff = []
    for c in x[1:]:
        coeff.append((c * lc_inv).n)
    sol = []
    for i in bigrange.range(p):
        if (i**3 + coeff[0] * i**2 + coeff[1] * i + coeff[2]) % p == 0:
            sol.append(i)
            break
    if len(sol) == 0:
        return sol
    X = e2_Fp([coeff[1] + (coeff[0] + sol[0]) * sol[0], coeff[0] + sol[0], 1],
              p)
    if len(X) != 0:
        sol.extend(X)
    return sol