示例#1
0
 def reduce_sl2z(self, inverse=False):
     if self.imag_sgn() <= 0:
         raise ValueError("not in the upper half-plane")
     # todo: use numerical code in arb to improve performance
     tau = self
     a, b, c, d = fmpz(1), fmpz(0), fmpz(0), fmpz(1)
     half = alg(1) / 2
     minus_half = -half
     while 1:
         x = tau.real
         if x < minus_half or x >= half:
             n = (x + half).floor().fmpz()
             tau -= n
             a -= n * c
             b -= n * d
         else:
             v = abs(tau)
             if v < 1 or (v == 1 and x > 0):
                 tau = -1 / tau
                 a, b, c, d = -c, -d, a, b
             else:
                 break
     if inverse:
         a, b, c, d = d, -b, -c, a
     if c < 0 or (c == 0 and d < 0):
         a = -a
         b = -b
         c = -c
         d = -d
     return tau, (a, b, c, d)
示例#2
0
def generate_keys(bit_length=1024, e=65537):
    p = fmpz(number.getPrime(bit_length))
    q = fmpz(number.getPrime(bit_length))
    n = p * q
    # Carmichael's totient function, which is the same as Euler's in this case.
    l = fmpz(lcm(p - 1, q - 1))
    public_key = (n, e)
    d = inverse(e, l)
    private_key = (n, d)
    return (p, q, n, l, e, d, public_key, private_key)
示例#3
0
def test_fmpz_mat():
    M = flint.fmpz_mat
    a = M(2, 3, [1, 2, 3, 4, 5, 6])
    b = M(2, 3, [4, 5, 6, 7, 8, 9])
    assert a == a
    assert a == M(a)
    assert a != b
    assert a.nrows() == 2
    assert a.ncols() == 3
    assert a.entries() == [1, 2, 3, 4, 5, 6]
    assert a.table() == [[1, 2, 3], [4, 5, 6]]
    assert (a + b).entries() == [5, 7, 9, 11, 13, 15]
    assert raises(a.det, ValueError)
    assert +a == a
    assert -a == M(2, 3, [-1, -2, -3, -4, -5, -6])
    c = M(2, 2, [1, 2, 3, 4])
    assert c.det() == -2
    assert raises(lambda: a + c, ValueError)
    assert (a * 3).entries() == [3, 6, 9, 12, 15, 18]
    assert (3 * a).entries() == [3, 6, 9, 12, 15, 18]
    assert (a * long(3)).entries() == [3, 6, 9, 12, 15, 18]
    assert (long(3) * a).entries() == [3, 6, 9, 12, 15, 18]
    assert (a * flint.fmpz(3)).entries() == [3, 6, 9, 12, 15, 18]
    assert (flint.fmpz(3) * a).entries() == [3, 6, 9, 12, 15, 18]
    assert M.randrank(5, 7, 3, 10).rank() == 3
    A = M.randbits(5, 3, 2)
    B = M.randtest(3, 7, 3)
    C = M.randtest(7, 2, 4)
    assert A * (B * C) == (A * B) * C
    assert bool(M(2, 2, [0, 0, 0, 0])) == False
    assert bool(M(2, 2, [0, 0, 0, 1])) == True
    ctx.pretty = False
    assert repr(M(2, 2, [1, 2, 3, 4])) == 'fmpz_mat(2, 2, [1, 2, 3, 4])'
    ctx.pretty = True
    assert str(M(2, 2, [1, 2, 3, 4])) == '[1, 2]\n[3, 4]'
    assert M(1, 2, [3, 4]) * flint.fmpq(1, 3) == flint.fmpq_mat(
        1, 2, [1, flint.fmpq(4, 3)])
    assert flint.fmpq(1, 3) * M(1, 2, [3, 4]) == flint.fmpq_mat(
        1, 2, [1, flint.fmpq(4, 3)])
    assert M(1, 2, [3, 4]) / 3 == flint.fmpq_mat(1, 2, [1, flint.fmpq(4, 3)])
    assert M(2, 2,
             [1, 2, 3, 4
              ]).inv().det() == flint.fmpq(1) / M(2, 2, [1, 2, 3, 4]).det()
    assert M(2, 2, [1, 2, 3, 4]).inv().inv() == M(2, 2, [1, 2, 3, 4])
    assert raises(lambda: M.randrank(4, 3, 4, 1), ValueError)
    assert raises(lambda: M.randrank(3, 4, 4, 1), ValueError)
    assert M(1, 1, [3])**5 == M(1, 1, [3**5])
    assert raises(lambda: M(1, 2)**3, ValueError)
    assert raises(lambda: M(1, 1)**M(1, 1), TypeError)
    assert raises(lambda: 1**M(1, 1), TypeError)
    assert raises(lambda: M([1]), TypeError)
    assert raises(lambda: M([[1], [2, 3]]), ValueError)
    assert M([[1, 2, 3], [4, 5, 6]]) == M(2, 3, [1, 2, 3, 4, 5, 6])
示例#4
0
 def gaussian_integer(a, b):
     if b == 0:
         return alg(a)
     a = fmpz(a)
     b = fmpz(b)
     orig = ctx.prec
     ctx.prec = 64
     try:
         z = acb(a, b)
     finally:
         ctx.prec = orig
     res = alg(_minpoly=fmpz_poly([a**2 + b**2, -2 * a, 1]), _enclosure=z)
     return res
示例#5
0
def test_nmod_mat():
    M = flint.nmod_mat
    G = flint.nmod
    Z = flint.fmpz_mat
    a = M(2, 3, [1, 2, 3, 4, 5, 6], 17)
    b = M(2, 3, [4, 5, 6, 7, 8, 9], 17)
    assert a == a
    assert a == M(a)
    assert a != b
    assert a.nrows() == 2
    assert a.ncols() == 3
    assert a.entries() == [G(x, 17) for x in [1, 2, 3, 4, 5, 6]]
    assert a.table() == [[G(x, 17) for x in [1, 2, 3]],
                         [G(x, 17) for x in [4, 5, 6]]]
    assert (a + b).entries() == [G(x, 17) for x in [5, 7, 9, 11, 13, 15]]
    assert raises(a.det, ValueError)
    assert +a == a
    assert -a == M(2, 3, [-1, -2, -3, -4, -5, -6], 17)
    c = M(2, 2, [1, 2, 3, 4], 17)
    assert c.det() == G(-2, 17)
    assert raises(lambda: a + c, ValueError)
    assert (a * 3).entries() == [G(x, 17) for x in [3, 6, 9, 12, 15, 18]]
    assert (3 * a).entries() == [G(x, 17) for x in [3, 6, 9, 12, 15, 18]]
    assert (a * long(3)).entries() == [G(x, 17) for x in [3, 6, 9, 12, 15, 18]]
    assert (long(3) * a).entries() == [G(x, 17) for x in [3, 6, 9, 12, 15, 18]]
    assert (a * flint.fmpz(3)).entries() == [
        G(x, 17) for x in [3, 6, 9, 12, 15, 18]
    ]
    assert (flint.fmpz(3) *
            a).entries() == [G(x, 17) for x in [3, 6, 9, 12, 15, 18]]
    assert M(2, 2, [1, 1, 2, 2], 17).rank() == 1
    A = M(5, 3, Z.randbits(5, 3, 5).entries(), 17)
    B = M(3, 7, Z.randtest(3, 7, 5).entries(), 17)
    C = M(7, 2, Z.randtest(7, 2, 5).entries(), 17)
    assert A * (B * C) == (A * B) * C
    assert bool(M(2, 2, [0, 0, 0, 0], 17)) == False
    assert bool(M(2, 2, [0, 0, 0, 1], 17)) == True
    ctx.pretty = False
    assert repr(M(2, 2, [1, 2, 3, 4],
                  17)) == 'nmod_mat(2, 2, [1, 2, 3, 4], 17)'
    ctx.pretty = True
    assert str(M(2, 2, [1, 2, 3, 4], 17)) == '[1, 2]\n[3, 4]'
    assert M(1, 2, [3, 4], 17) / 3 == M(1, 2, [3, 4], 17) * (~G(3, 17))
    assert M(2, 2, [1, 2, 3, 4],
             17).inv().det() == ~(M(2, 2, [1, 2, 3, 4], 17).det())
    assert M(2, 2, [1, 2, 3, 4], 17).inv().inv() == M(2, 2, [1, 2, 3, 4], 17)
    assert M(2, 2, [0, 1, 2, 3], 17) * M(2, 2, [2, 3, 4, 5], 17) == M(
        2, 2, [4, 5, 16, 4], 17)
    assert raises(lambda: M([1], 5), TypeError)
    assert raises(lambda: M([[1], [2, 3]], 5), ValueError)
    assert M([[1, 2, 3], [4, 5, 6]], 5) == M(2, 3, [1, 2, 3, 4, 5, 6], 5)
示例#6
0
def array_int_to_fmpz(arr):
    """
    **Description:**
    Converts a numpy array with 64-bit integer entries to fmpz entries.

    **Arguments:**
    - `arr` *(array_like)*: A numpy array with 64-bit integer entries.

    **Returns:**
    *(numpy.ndarray)* A numpy array with fmpz entries.

    **Example:**
    We convert an integer array to an fmpz array.
    ```python {3}
    from cytools.utils import array_int_to_fmpz
    arr = [[1,0,0],[0,2,0],[0,0,3]]
    array_int_to_fmpz(arr)
    # array([[1, 0, 0],
    #        [0, 2, 0],
    #        [0, 0, 3]], dtype=object)
    ```
    """
    in_arr = np.array(arr, dtype=int)
    out_arr = np.empty(in_arr.shape, dtype=object)
    for i in range(len(in_arr.flat)):
        out_arr.flat[i] = fmpz(int(in_arr.flat[i]))
    return out_arr
示例#7
0
def bit_pow_mod_n(b, m, n):
    acc = nmod(1, n)
    z = nmod(b, n)
    while m:
        if m & 1:  # check the least significant bit
            acc *= z
        z *= z
        m >>= 1  # the bit shift
    return fmpz(acc)
示例#8
0
def main():
    ''' Driver function '''
    minimum = 15499 / 94744
    denom = 2 * 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23
    proper = denom - 1
    while int(fmpz.euler_phi(fmpz(denom))) / proper >= minimum:
        denom += 1
        proper += 1
    print(denom)
示例#9
0
def test_fmpz_mat():
    M = flint.fmpz_mat
    a = M(2,3,[1,2,3,4,5,6])
    b = M(2,3,[4,5,6,7,8,9])
    assert a == a
    assert a == M(a)
    assert a != b
    assert a.nrows() == 2
    assert a.ncols() == 3
    assert a.entries() == [1,2,3,4,5,6]
    assert a.table() == [[1,2,3],[4,5,6]]
    assert (a + b).entries() == [5,7,9,11,13,15]
    assert raises(a.det, ValueError)
    assert +a == a
    assert -a == M(2,3,[-1,-2,-3,-4,-5,-6])
    c = M(2,2,[1,2,3,4])
    assert c.det() == -2
    assert raises(lambda: a + c, ValueError)
    assert (a * 3).entries() == [3,6,9,12,15,18]
    assert (3 * a).entries() == [3,6,9,12,15,18]
    assert (a * 3L).entries() == [3,6,9,12,15,18]
    assert (3L * a).entries() == [3,6,9,12,15,18]
    assert (a * flint.fmpz(3)).entries() == [3,6,9,12,15,18]
    assert (flint.fmpz(3) * a).entries() == [3,6,9,12,15,18]
    assert M.randrank(5,7,3,10).rank() == 3
    A = M.randbits(5,3,2)
    B = M.randtest(3,7,3)
    C = M.randtest(7,2,4)
    assert A*(B*C) == (A*B)*C
    assert bool(M(2,2,[0,0,0,0])) == False
    assert bool(M(2,2,[0,0,0,1])) == True
    assert repr(M(2,2,[1,2,3,4])) == 'fmpz_mat(2, 2, [1, 2, 3, 4])'
    assert str(M(2,2,[1,2,3,4])) == '[1, 2]\n[3, 4]'
    assert M(1,2,[3,4]) * flint.fmpq(1,3) == flint.fmpq_mat(1, 2, [1, flint.fmpq(4,3)])
    assert flint.fmpq(1,3) * M(1,2,[3,4]) == flint.fmpq_mat(1, 2, [1, flint.fmpq(4,3)])
    assert M(1,2,[3,4]) / 3 == flint.fmpq_mat(1, 2, [1, flint.fmpq(4,3)])
    assert (~M(2,2,[1,2,3,4])).det() == flint.fmpq(1) / M(2,2,[1,2,3,4]).det()
    assert ~~M(2,2,[1,2,3,4]) == M(2,2,[1,2,3,4])
    assert raises(lambda: M.randrank(4,3,4,1), ValueError)
    assert raises(lambda: M.randrank(3,4,4,1), ValueError)
    assert M(1,1,[3]) ** 5 == M(1,1,[3**5])
    assert raises(lambda: M(1,2) ** 3, ValueError)
    assert raises(lambda: M(1,1) ** M(1,1), TypeError)
    assert raises(lambda: 1 ** M(1,1), TypeError)
示例#10
0
def test_fmpq():
    Q = flint.fmpq
    assert Q() == Q(0)
    assert Q(0) != Q(1)
    assert Q(0) == 0
    assert 0 == Q(0)
    assert Q(2) != 1
    assert 1 != Q(2)
    assert Q(1, 2) != 1
    assert Q(2, 3) == Q(flint.fmpz(2), long(3))
    assert Q(-2, -4) == Q(1, 2)
    assert bool(Q(0)) == False
    assert bool(Q(1)) == True
    assert Q(1, 3) + Q(2, 3) == 1
    assert Q(1, 3) - Q(2, 3) == Q(-1, 3)
    assert Q(1, 3) * Q(2, 3) == Q(2, 9)
    assert Q(1, 3) + 2 == Q(7, 3)
    assert 2 + Q(1, 3) == Q(7, 3)
    assert Q(1, 3) - 2 == Q(-5, 3)
    assert 2 - Q(1, 3) == Q(5, 3)
    assert Q(1, 3) * 2 == Q(2, 3)
    assert 2 * Q(1, 3) == Q(2, 3)
    assert Q(2, 3) / Q(4, 5) == Q(5, 6)
    assert Q(2, 3) / 5 == Q(2, 15)
    assert Q(2, 3) / flint.fmpz(5) == Q(2, 15)
    assert 5 / Q(2, 3) == Q(15, 2)
    assert flint.fmpz(5) / Q(2, 3) == Q(15, 2)
    assert operator.truediv(Q(2, 3), 5) == Q(2, 15)
    ctx.pretty = False
    assert repr(Q(-2, 3)) == "fmpq(-2,3)"
    ctx.pretty = True
    assert str(Q(-2, 3)) == "-2/3"
    assert Q(2, 3).p == Q(2, 3).numer() == 2
    assert Q(2, 3).q == Q(2, 3).denom() == 3
    assert +Q(5, 7) == Q(5, 7)
    assert -Q(5, 7) == Q(-5, 7)
    assert -Q(-5, 7) == Q(5, 7)
    assert abs(Q(5, 7)) == Q(5, 7)
    assert abs(-Q(5, 7)) == Q(5, 7)
    assert raises(lambda: Q(1, 0), ZeroDivisionError)
    assert raises(lambda: Q(1, 2) / Q(0), ZeroDivisionError)
    assert raises(lambda: Q(1, 2) / 0, ZeroDivisionError)
示例#11
0
def test_fmpq():
    Q = flint.fmpq
    assert Q() == Q(0)
    assert Q(0) != Q(1)
    assert Q(0) == 0
    assert 0 == Q(0)
    assert Q(2) != 1
    assert 1 != Q(2)
    assert Q(1,2) != 1
    assert Q(2,3) == Q(flint.fmpz(2),3L)
    assert Q(-2,-4) == Q(1,2)
    assert bool(Q(0)) == False
    assert bool(Q(1)) == True
    assert Q(1,3) + Q(2,3) == 1
    assert Q(1,3) - Q(2,3) == Q(-1,3)
    assert Q(1,3) * Q(2,3) == Q(2,9)
    assert Q(1,3) + 2 == Q(7,3)
    assert 2 + Q(1,3) == Q(7,3)
    assert Q(1,3) - 2 == Q(-5,3)
    assert 2 - Q(1,3) == Q(5,3)
    assert Q(1,3) * 2 == Q(2,3)
    assert 2 * Q(1,3) == Q(2,3)
    assert Q(2,3) / Q(4,5) == Q(5,6)
    assert Q(2,3) / 5 == Q(2,15)
    assert Q(2,3) / flint.fmpz(5) == Q(2,15)
    assert 5 / Q(2,3) == Q(15,2)
    assert flint.fmpz(5) / Q(2,3) == Q(15,2)
    assert operator.truediv(Q(2,3), 5) == Q(2,15)
    assert repr(Q(-2,3)) == "fmpq(-2,3)"
    assert str(Q(-2,3)) == "-2/3"
    assert Q(2,3).p == Q(2,3).numer() == 2
    assert Q(2,3).q == Q(2,3).denom() == 3
    assert +Q(5,7) == Q(5,7)
    assert -Q(5,7) == Q(-5,7)
    assert -Q(-5,7) == Q(5,7)
    assert abs(Q(5,7)) == Q(5,7)
    assert abs(-Q(5,7)) == Q(5,7)
    assert raises(lambda: Q(1,0), ZeroDivisionError)
    assert raises(lambda: Q(1,2) / Q(0), ZeroDivisionError)
    assert raises(lambda: Q(1,2) / 0, ZeroDivisionError)
示例#12
0
def test_nmod_mat():
    M = flint.nmod_mat
    G = flint.nmod
    Z = flint.fmpz_mat
    a = M(2,3,[1,2,3,4,5,6],17)
    b = M(2,3,[4,5,6,7,8,9],17)
    assert a == a
    assert a == M(a)
    assert a != b
    assert a.nrows() == 2
    assert a.ncols() == 3
    assert a.entries() == [G(x,17) for x in [1,2,3,4,5,6]]
    assert a.table() == [[G(x,17) for x in [1,2,3]], [G(x,17) for x in [4,5,6]]]
    assert (a + b).entries() == [G(x,17) for x in [5,7,9,11,13,15]]
    assert raises(a.det, ValueError)
    assert +a == a
    assert -a == M(2,3,[-1,-2,-3,-4,-5,-6],17)
    c = M(2,2,[1,2,3,4],17)
    assert c.det() == G(-2,17)
    assert raises(lambda: a + c, ValueError)
    assert (a * 3).entries() == [G(x,17) for x in [3,6,9,12,15,18]]
    assert (3 * a).entries() == [G(x,17) for x in [3,6,9,12,15,18]]
    assert (a * 3L).entries() == [G(x,17) for x in [3,6,9,12,15,18]]
    assert (3L * a).entries() == [G(x,17) for x in [3,6,9,12,15,18]]
    assert (a * flint.fmpz(3)).entries() == [G(x,17) for x in [3,6,9,12,15,18]]
    assert (flint.fmpz(3) * a).entries() == [G(x,17) for x in [3,6,9,12,15,18]]
    assert M(2,2,[1,1,2,2],17).rank() == 1
    A = M(5,3,Z.randbits(5,3,5).entries(),17)
    B = M(3,7,Z.randtest(3,7,5).entries(),17)
    C = M(7,2,Z.randtest(7,2,5).entries(),17)
    assert A*(B*C) == (A*B)*C
    assert bool(M(2,2,[0,0,0,0],17)) == False
    assert bool(M(2,2,[0,0,0,1],17)) == True
    assert repr(M(2,2,[1,2,3,4],17)) == 'nmod_mat(2, 2, [1L, 2L, 3L, 4L], 17)'
    assert str(M(2,2,[1,2,3,4],17)) == '[1, 2]\n[3, 4]'
    assert M(1,2,[3,4],17) / 3 == M(1,2,[3,4],17) * (~G(3,17))
    assert (~M(2,2,[1,2,3,4], 17)).det() == ~(M(2,2,[1,2,3,4], 17).det())
    assert ~~M(2,2,[1,2,3,4], 17) == M(2,2,[1,2,3,4], 17)
    assert M(2,2,[0,1,2,3],17) * M(2, 2, [2,3,4,5], 17) == M(2,2,[4,5,16,4],17)
示例#13
0
def prime_chain_length(prime, chain_lengths):
    ''' Returns the length of the chain of numbers produced by iterating
    Euler's totient function starting with 'prime' and ending with 1. Some
    chain lengths are saved in 'chain_lengths' '''
    prev = prime
    cur = prime - 1
    chain = [prev]
    length = 2
    while cur != 1:
        if chain_lengths[cur]:
            length = len(chain) + chain_lengths[cur]
            break
        chain += [cur]
        prev = cur
        cur = fmpz.euler_phi(fmpz(prev))
        length += 1
    for i, n in enumerate(chain):
        chain_lengths[n] = length - i
    return length
示例#14
0
def inverse(a, n):
    if gcd(a, n) == 1:
        return fmpz(rinv_helper(n, a) % n)
    else:
        return "a is not invertible in Z/nZ"
示例#15
0
def test_fmpz():
    assert flint.fmpz() == flint.fmpz(0)
    L = [0, 1, 2, 3, 2**31-1, 2**31, 2**63-1, 2**63, 2**64-1, 2**64]
    L += [-x for x in L]
    for s in L:
        for t in L:
            for ltype in (flint.fmpz, int, long):
                for rtype in (flint.fmpz, int, long):
                    assert ltype(s) + rtype(t) == s + t
                    assert ltype(s) - rtype(t) == s - t
                    assert ltype(s) * rtype(t) == s * t
                    if t == 0:
                        assert raises(lambda: ltype(s) // rtype(t), ZeroDivisionError)
                        assert raises(lambda: ltype(s) % rtype(t), ZeroDivisionError)
                        assert raises(lambda: divmod(ltype(s), rtype(t)), ZeroDivisionError)
                    else:
                        assert ltype(s) // rtype(t) == s // t
                        assert ltype(s) % rtype(t) == s % t
                        assert divmod(ltype(s), rtype(t)) == divmod(s, t)
                    assert (ltype(s) == rtype(t)) == (s == t)
                    assert (ltype(s) != rtype(t)) == (s != t)
                    assert (ltype(s) < rtype(t)) == (s < t)
                    assert (ltype(s) <= rtype(t)) == (s <= t)
                    assert (ltype(s) > rtype(t)) == (s > t)
                    assert (ltype(s) >= rtype(t)) == (s >= t)
                    if 0 <= t < 10:
                        assert (ltype(s) ** rtype(t)) == (s ** t)
    assert +flint.fmpz(0) == 0
    assert +flint.fmpz(1) == 1
    assert +flint.fmpz(-1) == -1
    assert -flint.fmpz(0) == 0
    assert -flint.fmpz(1) == -1
    assert -flint.fmpz(-1) == 1
    assert abs(flint.fmpz(0)) == 0
    assert abs(flint.fmpz(1)) == 1
    assert abs(flint.fmpz(-1)) == 1
    assert int(flint.fmpz(2)) == 2
    assert isinstance(int(flint.fmpz(2)), int)
    assert long(flint.fmpz(2)) == 2
    assert isinstance(long(flint.fmpz(2)), long)
    assert repr(flint.fmpz(0)) == "fmpz(0)"
    assert repr(flint.fmpz(-27)) == "fmpz(-27)"
    assert bool(flint.fmpz(0)) == False
    assert bool(flint.fmpz(1)) == True
示例#16
0
    def as_quadratic(self, factor_limit=2**64):
        """
        Assuming that *self* has degree 1 or 2, returns (*a*, *b*, *c*)
        where *a* and *b* are *fmpq* rational numbers and *c* is a *fmpz*
        integer, such that *self* equals `a + b \sqrt{c}`.

        The integer *c* will not be a perfect square, but might not be
        squarefree since ensuring this property requires integer factorization.
        If *|c|* is initially smaller than *factor_limit*, it will be
        completely factored into its squarefree part (with the square content
        moved to *b*); otherwise, only a partial factorization will be performed.

            >>> alg(-23).as_quadratic()
            (-23, 0, 0)
            >>> (2 + alg.i() / 3).as_quadratic()
            (2, 1/3, -1)
            >>> x = (alg(5)/2 + alg(24).sqrt())**5
            >>> x.as_quadratic()
            (353525/32, 36341/8, 6)
            >>> x == alg(353525)/32 + alg(36341)/8 * alg(6).sqrt()
            True
            >>> alg(3 * 29**2 * (10**20+39)**2).sqrt().as_quadratic()
            (0, 2900000000000000001131, 3)
            >>> x = alg(3 * (10**10+1)**3 * (10**15+1)**2).sqrt()
            >>> a, b, c = x.as_quadratic()
            >>> (a, b, c)
            (0, 39340116598834051, 1938429316132524961593868203)
            >>> x == a + b*alg(c).sqrt()
            True
            >>> a, b, c = x.as_quadratic(factor_limit=10**50)
            >>> (a, b, c)
            (0, 10000000001000010000000001, 30000000003)
            >>> x == a + b*alg(c).sqrt()
            True

        """
        poly = self._minpoly
        if poly.degree() == 1:
            return (self.fmpq(), fmpq(), fmpz())
        if poly.degree() != 2:
            raise ValueError
        c, b, a = list(self.minpoly())
        D = b**2 - 4 * a * c
        Dsqrt = alg(D).sqrt()
        x = (-b + Dsqrt) / (2 * a)
        if self == x:
            bsign = 1
        else:
            x = (-b - Dsqrt) / (2 * a)
            bsign = -1
        a, b, c = fmpq(-b) / (2 * a), fmpq(bsign, 2 * a), D
        if abs(c) >= 4:
            if abs(c) < factor_limit:
                fac = c.factor()
            else:
                fac = c.factor(trial_limit=1000)
                # todo: the partial factoring in flint is wonky;
                # it should at least do a perfect power test or single-word
                # factorisation of the last factor
                if 1:
                    rem, reme = fac[-1]
                    if rem < factor_limit:
                        fac = fac[:-1] + [(pp, ee * reme)
                                          for (pp, ee) in rem.factor()]
                    elif rem.is_perfect_power():
                        for e in range(64, 1, -1):
                            p = rem.root(e)
                            if p**e == rem:
                                if p < factor_limit:
                                    fac2 = rem.factor()
                                    fac = fac[:-1]
                                    for (p, f) in fac2:
                                        fac.append((p, e * f * reme))
                                else:
                                    fac = fac[:-1] + [(p, e * reme)]
                                break
                check = 1
                for p, e in fac:
                    check *= p**e
                # assert check == abs(c)
            square = fmpz(1)
            squarefree = fmpz(1)
            for p, e in fac:
                if e % 2 == 0:
                    square *= p**(e // 2)
                else:
                    square *= p**(e // 2)
                    squarefree *= p
            if c < 0:
                squarefree = -squarefree
            b *= square
            c = squarefree
        # assert self == alg(a) + alg(b) * alg(c).sqrt()
        return a, b, c
示例#17
0
def test_fmpz_poly():
    Z = flint.fmpz_poly
    assert Z() == Z([])
    assert Z() == Z([0])
    assert Z() == Z([0, flint.fmpz(0), 0])
    assert Z() == Z([0, 0, 0])
    assert Z() != Z([1])
    assert Z([1]) == Z([1])
    assert Z([1]) == Z([flint.fmpz(1)])
    assert Z(Z([1, 2])) == Z([1, 2])
    for ztype in [int, long, flint.fmpz]:
        assert Z([1, 2, 3]) + ztype(5) == Z([6, 2, 3])
        assert ztype(5) + Z([1, 2, 3]) == Z([6, 2, 3])
        assert Z([1, 2, 3]) - ztype(5) == Z([-4, 2, 3])
        assert ztype(5) - Z([1, 2, 3]) == Z([4, -2, -3])
        assert Z([1, 2, 3]) * ztype(5) == Z([5, 10, 15])
        assert ztype(5) * Z([1, 2, 3]) == Z([5, 10, 15])
        assert Z([11, 6, 2]) // ztype(5) == Z([2, 1])
        assert ztype(5) // Z([-2]) == Z([-3])
        assert ztype(5) // Z([1, 2]) == 0
        assert Z([11, 6, 2]) % ztype(5) == Z([1, 1, 2])
        assert ztype(5) % Z([-2]) == Z([-1])
        assert ztype(5) % Z([1, 2]) == 5
        assert Z([1, 2, 3])**ztype(0) == 1
        assert Z([1, 2, 3])**ztype(1) == Z([1, 2, 3])
        assert Z([1, 2, 3])**ztype(2) == Z([1, 4, 10, 12, 9])
    assert +Z([1, 2]) == Z([1, 2])
    assert -Z([1, 2]) == Z([-1, -2])
    assert raises(lambda: Z([1, 2, 3])**-1, (OverflowError, ValueError))
    assert raises(lambda: Z([1, 2, 3])**Z([1, 2]), TypeError)
    assert raises(lambda: Z([1, 2]) // Z([]), ZeroDivisionError)
    assert raises(lambda: Z([]) // Z([]), ZeroDivisionError)
    assert raises(lambda: Z([1, 2]) % Z([]), ZeroDivisionError)
    assert raises(lambda: divmod(Z([1, 2]), Z([])), ZeroDivisionError)
    assert Z([]).degree() == -1
    assert Z([]).length() == 0
    p = Z([1, 2])
    assert p.length() == 2
    assert p.degree() == 1
    assert p[0] == 1
    assert p[1] == 2
    assert p[2] == 0
    assert p[-1] == 0
    assert raises(lambda: p.__setitem__(-1, 1), ValueError)
    p[0] = 3
    assert p[0] == 3
    p[4] = 7
    assert p.degree() == 4
    assert p[4] == 7
    assert p[3] == 0
    p[4] = 0
    assert p.degree() == 1
    assert p.coeffs() == [3, 2]
    assert Z([]).coeffs() == []
    assert bool(Z([])) == False
    assert bool(Z([1])) == True
    ctx.pretty = False
    assert repr(Z([1, 2])) == "fmpz_poly([1, 2])"
    ctx.pretty = True
    assert str(Z([1, 2])) == "2*x + 1"
    p = Z([3, 4, 5])
    assert p(2) == 31
    assert p(flint.fmpq(2, 3)) == flint.fmpq(71, 9)
    assert p(Z([1, -1])) == Z([12, -14, 5])
    assert p(flint.fmpq_poly([2, 3], 5)) == flint.fmpq_poly([27, 24, 9], 5)
    assert p(flint.arb("1.1")).overlaps(flint.arb("13.45"))
    assert p(flint.acb("1.1", "1.2")).overlaps(flint.acb("6.25", "18.00"))
示例#18
0
 def enclosure(self, pretty=False):
     if self.degree() == 1:
         c0 = self._minpoly[0]
         c1 = self._minpoly[1]
         return arb(c0) / (-c1)
     elif pretty:
         z = self.enclosure()
         re = z.real
         im = z.imag
         # detect zero real/imag part
         if z.real.contains(0):
             if self.real_sgn() == 0:
                 re = arb(0)
         if z.imag.contains(0):
             if self.imag_sgn() == 0:
                 im = arb(0)
         # detect exact (dyadic) real/imag parts
         # fixme: extracting real and imag parts and checking if
         # they are exact can be slow at high degree; this is a workaround
         # until that operation can be improved
         scale = fmpz(2)**max(10, ctx.prec - 20)
         if not re.is_exact() and (re * scale).unique_fmpz() is not None:
             n = (re * scale).unique_fmpz()
             b = self - fmpq(n, scale)
             if b.real_sgn() == 0:
                 re = arb(fmpq(n, scale))
         if not im.is_exact() and (im * scale).unique_fmpz() is not None:
             n = (im * scale).unique_fmpz()
             b = self - fmpq(n, scale) * alg.i()
             if b.imag_sgn() == 0:
                 im = arb(fmpq(n, scale))
         if im == 0:
             return arb(re)
         else:
             return acb(re, im)
     else:
         orig_prec = ctx.prec
         x = self._enclosure
         if x.rel_accuracy_bits() >= orig_prec - 2:
             return x
         # Try interval newton refinement
         f = self._minpoly
         g = self._minpoly.derivative()
         try:
             ctx.prec = max(x.rel_accuracy_bits(), 32) + 10
             for step in range(40):
                 ctx.prec *= 2
                 if ctx.prec > 1000000:
                     raise ValueError("excessive precision")
                 # print("root-refinement prec", ctx.prec)
                 # print(x.mid().str(10), x.rad().str(10))
                 xmid = x.mid()
                 y = xmid - f(xmid) / g(x)
                 if y.rel_accuracy_bits() >= 1.1 * orig_prec:
                     self._enclosure = y
                     return y
                 if y.rel_accuracy_bits() < 1.5 * x.rel_accuracy_bits() + 1:
                     # print("refinement failed -- recomputing roots")
                     roots = self._minpoly.roots()
                     near = [r for (r, mult) in roots if acb(r).overlaps(x)]
                     if len(near) == 1:
                         y = near[0]
                         if y.rel_accuracy_bits() >= 1.1 * orig_prec:
                             self._enclosure = y
                             return y
                 x = y
             raise ValueError("root refinement did not converge")
         finally:
             ctx.prec = orig_prec
示例#19
0
def test_fmpz():
    assert flint.fmpz() == flint.fmpz(0)
    L = [0, 1, 2, 3, 2**31 - 1, 2**31, 2**63 - 1, 2**63, 2**64 - 1, 2**64]
    L += [-x for x in L]
    for s in L:
        for t in L:
            for ltype in (flint.fmpz, int, long):
                for rtype in (flint.fmpz, int, long):
                    assert ltype(s) + rtype(t) == s + t
                    assert ltype(s) - rtype(t) == s - t
                    assert ltype(s) * rtype(t) == s * t
                    if t == 0:
                        assert raises(lambda: ltype(s) // rtype(t),
                                      ZeroDivisionError)
                        assert raises(lambda: ltype(s) % rtype(t),
                                      ZeroDivisionError)
                        assert raises(lambda: divmod(ltype(s), rtype(t)),
                                      ZeroDivisionError)
                    else:
                        assert ltype(s) // rtype(t) == s // t
                        assert ltype(s) % rtype(t) == s % t
                        assert divmod(ltype(s), rtype(t)) == divmod(s, t)
                    assert (ltype(s) == rtype(t)) == (s == t)
                    assert (ltype(s) != rtype(t)) == (s != t)
                    assert (ltype(s) < rtype(t)) == (s < t)
                    assert (ltype(s) <= rtype(t)) == (s <= t)
                    assert (ltype(s) > rtype(t)) == (s > t)
                    assert (ltype(s) >= rtype(t)) == (s >= t)
                    if 0 <= t < 10:
                        assert (ltype(s)**rtype(t)) == (s**t)
    assert +flint.fmpz(0) == 0
    assert +flint.fmpz(1) == 1
    assert +flint.fmpz(-1) == -1
    assert -flint.fmpz(0) == 0
    assert -flint.fmpz(1) == -1
    assert -flint.fmpz(-1) == 1
    assert abs(flint.fmpz(0)) == 0
    assert abs(flint.fmpz(1)) == 1
    assert abs(flint.fmpz(-1)) == 1
    assert int(flint.fmpz(2)) == 2
    assert isinstance(int(flint.fmpz(2)), int)
    assert long(flint.fmpz(2)) == 2
    assert isinstance(long(flint.fmpz(2)), long)
    ctx.pretty = False
    assert repr(flint.fmpz(0)) == "fmpz(0)"
    assert repr(flint.fmpz(-27)) == "fmpz(-27)"
    ctx.pretty = True
    assert repr(flint.fmpz(0)) == "0"
    assert repr(flint.fmpz(-27)) == "-27"
    assert bool(flint.fmpz(0)) == False
    assert bool(flint.fmpz(1)) == True
示例#20
0
def main():
    ''' The sum of totient values up to n gives the number of reduced proper
    fractions with denominator less than or equal to n '''
    print(sum(fmpz.euler_phi(fmpz(x)) for x in range(2, 10**6+1)))
示例#21
0
def test_fmpz_poly():
    Z = flint.fmpz_poly
    assert Z() == Z([])
    assert Z() == Z([0])
    assert Z() == Z([0,flint.fmpz(0),0])
    assert Z() == Z([0,0L,0])
    assert Z() != Z([1])
    assert Z([1]) == Z([1L])
    assert Z([1]) == Z([flint.fmpz(1)])
    assert Z(Z([1,2])) == Z([1,2])
    for ztype in [int, long, flint.fmpz]:
        assert Z([1,2,3]) + ztype(5) == Z([6,2,3])
        assert ztype(5) + Z([1,2,3]) == Z([6,2,3])
        assert Z([1,2,3]) - ztype(5) == Z([-4,2,3])
        assert ztype(5) - Z([1,2,3]) == Z([4,-2,-3])
        assert Z([1,2,3]) * ztype(5) == Z([5,10,15])
        assert ztype(5) * Z([1,2,3]) == Z([5,10,15])
        assert Z([11,6,2]) // ztype(5) == Z([2,1])
        assert ztype(5) // Z([-2]) == Z([-3])
        assert ztype(5) // Z([1,2]) == 0
        assert Z([11,6,2]) % ztype(5) == Z([1,1,2])
        assert ztype(5) % Z([-2]) == Z([-1])
        assert ztype(5) % Z([1,2]) == 5
        assert Z([1,2,3]) ** ztype(0) == 1
        assert Z([1,2,3]) ** ztype(1) == Z([1,2,3])
        assert Z([1,2,3]) ** ztype(2) == Z([1,4,10,12,9])
    assert +Z([1,2]) == Z([1,2])
    assert -Z([1,2]) == Z([-1,-2])
    assert raises(lambda: Z([1,2,3]) ** -1, (OverflowError, ValueError))
    assert raises(lambda: Z([1,2,3]) ** Z([1,2]), TypeError)
    assert raises(lambda: Z([1,2]) // Z([]), ZeroDivisionError)
    assert raises(lambda: Z([]) // Z([]), ZeroDivisionError)
    assert raises(lambda: Z([1,2]) % Z([]), ZeroDivisionError)
    assert raises(lambda: divmod(Z([1,2]), Z([])), ZeroDivisionError)
    assert Z([]).degree() == -1
    assert Z([]).length() == 0
    p = Z([1,2])
    assert p.length() == 2
    assert p.degree() == 1
    assert p[0] == 1
    assert p[1] == 2
    assert p[2] == 0
    assert p[-1] == 0
    assert raises(lambda: p.__setitem__(-1, 1), ValueError)
    p[0] = 3
    assert p[0] == 3
    p[4] = 7
    assert p.degree() == 4
    assert p[4] == 7
    assert p[3] == 0
    p[4] = 0
    assert p.degree() == 1
    assert p.coeffs() == [3,2]
    assert Z([]).coeffs() == []
    assert bool(Z([])) == False
    assert bool(Z([1])) == True
    assert repr(Z([1,2])) == "fmpz_poly([1, 2])"
    assert str(Z([1,2])) == "2*x+1"
    p = Z([3,4,5])
    assert p(2) == 31
    assert p(flint.fmpq(2,3)) == flint.fmpq(71,9)
    assert p(Z([1,-1])) == Z([12,-14,5])
    assert p(flint.fmpq_poly([2,3],5)) == flint.fmpq_poly([27,24,9],5)
示例#22
0
def string2int(s):
    # return int.from_bytes(s.encode("utf-8"), byteorder = "big")
    return fmpz(number.bytes_to_long(s.encode("utf-8")))