Esempio n. 1
0
 def testGenerator(self):
     g = prime.generator()
     self.assertEqual(2, g.next())
     self.assertEqual(3, g.next())
     ##         g2 = prime.generator(lambda x: x % 5 == 4) # old fashioned
     import itertools
     g2 = itertools.ifilter(lambda x: x % 5 == 4, prime.generator())
     self.assertEqual(19, g2.next())
     self.assertEqual(29, g2.next())
Esempio n. 2
0
def trial_division_ternary(n):
    """
    Test the squarefreeness of n.
    The return value is one of the True or False, not None.

    The method is a kind of trial division.
    """
    result = trivial_test_ternary(n)
    if result is not None:
        return result

    for p in prime.generator():
        if not (n % (p*p)):
            # found a square factor
            return False
        elif not (n % p):
            # found a non-square factor
            n //= p
            result = trivial_test_ternary(n)
            if result is not None:
                return result
        if p*p*p > n:
            break
    # At the end of the loop:
    #   n doesn't have any factor less than its cubic root.
    #   n is not a prime nor a perfect square number.
    # The factor must be two primes p and q such that p < sqrt(n) < q.
    return True
Esempio n. 3
0
def trial_division(n):
    """
    Test whether n is squarefree or not.

    The method is a kind of trial division.
    """
    try:
        return trivial_test(n)
    except Undetermined:
        pass

    for p in prime.generator():
        if not (n % (p*p)):
            # found a square factor
            return False
        elif not (n % p):
            # found a non-square factor
            n //= p
            try:
                return trivial_test(n)
            except Undetermined:
                pass
        if p*p*p > n:
            break
    # At the end of the loop:
    #   n doesn't have any factor less than its cubic root.
    #   n is not a prime nor a perfect square number.
    # The factor must be two primes p and q such that p < sqrt(n) < q.
    return True
Esempio n. 4
0
def trial_division(n):
    """
    Test whether n is squarefree or not.

    The method is a kind of trial division.
    """
    try:
        return trivial_test(n)
    except Undetermined:
        pass

    for p in prime.generator():
        if not (n % (p*p)):
            # found a square factor
            return False
        elif not (n % p):
            # found a non-square factor
            n //= p
            try:
                return trivial_test(n)
            except Undetermined:
                pass
        if p*p*p > n:
            break
    # At the end of the loop:
    #   n doesn't have any factor less than its cubic root.
    #   n is not a prime nor a perfect square number.
    # The factor must be two primes p and q such that p < sqrt(n) < q.
    return True
Esempio n. 5
0
def trial_division_ternary(n):
    """
    Test the squarefreeness of n.
    The return value is one of the True or False, not None.

    The method is a kind of trial division.
    """
    result = trivial_test_ternary(n)
    if result is not None:
        return result

    for p in prime.generator():
        if not (n % (p*p)):
            # found a square factor
            return False
        elif not (n % p):
            # found a non-square factor
            n //= p
            result = trivial_test_ternary(n)
            if result is not None:
                return result
        if p*p*p > n:
            break
    # At the end of the loop:
    #   n doesn't have any factor less than its cubic root.
    #   n is not a prime nor a perfect square number.
    # The factor must be two primes p and q such that p < sqrt(n) < q.
    return True
Esempio n. 6
0
def padic_factorization(f):
    """
    padic_factorization(f) -> p, factors

    Return a prime p and a p-adic factorization of given integer
    coefficient squarefree polynomial f. The result factors have
    integer coefficients, injected from F_p to its minimum absolute
    representation. The prime is chosen to be 1) f is still squarefree
    mod p, 2) the number of factors is not greater than with the
    successive prime.
    """
    num_factors = f.degree()
    stock = None
    for p in prime.generator():
        fmodp = uniutil.polynomial(f.terms(),
                                   finitefield.FinitePrimeField.getInstance(p))
        if f.degree() > fmodp.degree():
            continue
        g = fmodp.getRing().gcd(fmodp, fmodp.differentiate())
        if g.degree() == 0:
            fp_factors = fmodp.factor()
            if (not stock) or num_factors > len(fp_factors):
                stock = (p, fp_factors)
                if len(fp_factors) == 1:
                    return stock
                num_factors = len(fp_factors)
            else:
                break
    p = stock[0]
    fp_factors = []
    for (fp_factor, m) in stock[1]:
        assert m == 1  # since squarefree
        fp_factors.append(minimum_absolute_injection(fp_factor))
    return (p, fp_factors)
Esempio n. 7
0
def pmom(n, **options):
    """
    This function tries to find a non-trivial factor of n using
    Algorithm 8.8.2 (p-1 first stage) of Cohen's book.
    In case of N = pow(2,i), this program will not terminate.
    """
    # verbosity
    verbose = options.get('verbose', False)
    if not verbose:
        _silence()

    # initialize
    x = y = 2
    primes = []
    if 'B' in options:
        B = options['B']
    else:
        B = 10000

    for q in prime.generator():
        primes.append(q)
        if q > B:
            if gcd.gcd(x - 1, n) == 1:
                if not verbose:
                    _verbose()
                return 1
            x = y
            break
        q1 = q
        l = B // q
        while q1 <= l:
            q1 *= q
        x = pow(x, q1, n)
        if len(primes) >= 20:
            if gcd.gcd(x - 1, n) == 1:
                primes, y = [], x
            else:
                x = y
                break

    for q in primes:
        q1 = q
        while q1 <= B:
            x = pow(x, q, n)
            g = gcd.gcd(x - 1, n)
            if g != 1:
                if not verbose:
                    _verbose()
                if g == n:
                    return 1
                return g
            q1 *= q
Esempio n. 8
0
def zeta_real(s):
    """
    zeta function for a real positive value s.

    zeta(s) = \sum n^{-s} = \prod (1 - p^{-s})^{-1}
    """
    zeta_s = 1
    for p in prime.generator():
        euler_factor = 1 - 1 / p**s
        if euler_factor == 1:
            break
        zeta_s /= euler_factor
    return zeta_s
Esempio n. 9
0
def pmom(n, **options):
    """
    This function tries to find a non-trivial factor of n using
    Algorithm 8.8.2 (p-1 first stage) of Cohen's book.
    In case of N = pow(2,i), this program will not terminate.
    """
    # verbosity
    verbose = options.get('verbose', False)
    if not verbose:
        _silence()

    # initialize
    x , B = 2 , 10000001
    y = x
    primes = []

    for q in prime.generator():
        primes.append(q)
        if q > B:
            if gcd.gcd(x-1, n) == 1:
                if not verbose:
                    _verbose()
                return 1
            x = y
            break
        q1 = q
        l = B//q
        while q1 <= l:
            q1 *= q
        x = pow(x, q1, n)
        if len(primes) >= 20:
            if gcd.gcd(x-1, n) == 1:
                primes, y = [], x
            else:
                x = y
                break

    for q in primes:
        q1 = q
        while q1 <= B:
            x = pow(x, q, n)
            g = gcd.gcd(x-1, n)
            if g != 1:
                if not verbose:
                    _verbose()
                if g == n:
                    return 1
                return g
            q1 *= q
Esempio n. 10
0
 def _parse_seq(self, options):
     """
     Parse 'options' to define trial sequaence.
     """
     if 'start' in options and 'stop' in options:
         if 'step' in options:
             trials = bigrange.range(options['start'], options['stop'], options['step'])
         else:
             trials = bigrange.range(options['start'], options['stop'])
     elif 'iterator' in options:
         trials = options['iterator']
     elif 'eratosthenes' in options:
         trials = prime.generator_eratosthenes(options['eratosthenes'])
     elif options['n'] < 1000000:
         trials = prime.generator_eratosthenes(arith1.floorsqrt(options['n']))
     else:
         trials = prime.generator()
     return trials
Esempio n. 11
0
 def _parse_seq(self, options):
     """
     Parse 'options' to define trial sequaence.
     """
     if 'start' in options and 'stop' in options:
         if 'step' in options:
             trials = bigrange.range(options['start'], options['stop'],
                                     options['step'])
         else:
             trials = bigrange.range(options['start'], options['stop'])
     elif 'iterator' in options:
         trials = options['iterator']
     elif 'eratosthenes' in options:
         trials = prime.generator_eratosthenes(options['eratosthenes'])
     elif options['n'] < 1000000:
         trials = prime.generator_eratosthenes(
             arith1.floorsqrt(options['n']))
     else:
         trials = prime.generator()
     return trials
Esempio n. 12
0
def trialDivision(n, **options):
    """
    Return a factor of given integer by trial division.

    options can be either:
    1) 'start' and 'stop' as range parameters.
    2) 'iterator' as an iterator of primes.
    If both options are not given, prime factor is searched from 2
    to the square root of the given integer.
    """
    # verbosity
    verbose = options.get('verbose', False)
    if not verbose:
        _silence()

    if 'start' in options and 'stop' in options:
        if 'step' in options:
            trials = list(
                range(options['start'], options['stop'], options['step']))
        else:
            trials = list(range(options['start'], options['stop']))
    elif 'iterator' in options:
        trials = options['iterator']
    elif n < 1000000:
        trials = prime.generator_eratosthenes(arith1.floorsqrt(n))
    else:
        trials = prime.generator()

    limit = arith1.floorsqrt(n)
    for p in trials:
        if limit < p:
            break
        if 0 == n % p:
            if not verbose:
                _verbose()
            return p
    if not verbose:
        _verbose()
    return 1
Esempio n. 13
0
def trialDivision(n, **options):
    """
    Return a factor of given integer by trial division.

    options can be either:
    1) 'start' and 'stop' as range parameters.
    2) 'iterator' as an iterator of primes.
    If both options are not given, prime factor is searched from 2
    to the square root of the given integer.
    """
    # verbosity
    verbose = options.get('verbose', False)
    if not verbose:
        _silence()

    if 'start' in options and 'stop' in options:
        if 'step' in options:
            trials = range(options['start'], options['stop'], options['step'])
        else:
            trials = range(options['start'], options['stop'])
    elif 'iterator' in options:
        trials = options['iterator']
    elif n < 1000000:
        trials = prime.generator_eratosthenes(arith1.floorsqrt(n))
    else:
        trials = prime.generator()

    for p in trials:
        if not (n % p):
            if not verbose:
                _verbose()
            return p
        if p ** 2 > n:
            break
    if not verbose:
        _verbose()
    return 1
Esempio n. 14
0
def padic_factorization(f):
    """
    padic_factorization(f) -> p, factors

    Return a prime p and a p-adic factorization of given integer
    coefficient squarefree polynomial f. The result factors have
    integer coefficients, injected from F_p to its minimum absolute
    representation. The prime is chosen to be 1) f is still squarefree
    mod p, 2) the number of factors is not greater than with the
    successive prime.
    """
    num_factors = f.degree()
    stock = None
    for p in prime.generator():
        fmodp = uniutil.polynomial(
            f.terms(),
            finitefield.FinitePrimeField.getInstance(p))
        if f.degree() > fmodp.degree():
            continue
        g = fmodp.getRing().gcd(fmodp,
                                fmodp.differentiate())
        if g.degree() == 0:
            fp_factors = fmodp.factor()
            if not stock or num_factors > len(fp_factors):
                stock = (p, fp_factors)
                if len(fp_factors) == 1:
                    return stock
                num_factors = len(fp_factors)
            else:
                break
    p = stock[0]
    fp_factors = []
    for (fp_factor, m) in stock[1]:
        assert m == 1 # since squarefree
        fp_factors.append(minimum_absolute_injection(fp_factor))
    return (p, fp_factors)
Esempio n. 15
0
        if i in primes:
            all_subsets |= primes[i]
    r = frozenset(all_subsets)
    for i in all_subsets:
        primes[i] = r


for case_no in xrange(0, input()):
    print "Case #%s:" % (case_no + 1,),

    A, B, P = map(long, raw_input().split())
    B += 1
    sz = B-A

    prime_numbers = []
    for p in prime.generator():
        if p > sz:
            break
        if p >=P: prime_numbers.append( p )

    arr = defaultdict(list)
    for p in prime_numbers:
        s = (A / p) * p
        if s < A: s += p
        while s < B:
            arr[s].append( p )
            s += p
    primes = {}
    g = 0
    n = A
    while n < B: