def find_solution_root_fixed(frontiers, target):
    if not isinstance(target, INT_TYPES):
        target = target.as_int
    factors = get_target_factors(target)
    assert len(factors) == 2
    p, q = map(int_to_digits, factors)
    p_digits = tuple(p)
    q_digits = tuple(q)

    num_found = 0

    for num_dig in sorted(frontiers.keys()):
        frontier = frontiers[num_dig]
        for rank, node in enumerate(frontier):

            target_match = set((((p_digits[:node.p.num_fixed_digits_left],
                                  p_digits[-node.p.num_fixed_digits_right:])),

                                 (q_digits[:node.q.num_fixed_digits_left],
                                  q_digits[-node.q.num_fixed_digits_right:])))

            node_match = set((((tuple(node.p.digits)[:node.p.num_fixed_digits_left],
                                tuple(node.p.digits)[-node.p.num_fixed_digits_right:])),

                               (tuple(node.q.digits)[:node.q.num_fixed_digits_left],
                                tuple(node.q.digits)[-node.q.num_fixed_digits_right:])))

            if target_match == node_match:
                num_found += 1
                assert num_found == 1
                print num_dig, rank, len(frontier), BASE**(num_dig - 2)
    assert num_found == 1
示例#2
0
def find_solution_root(frontiers, target):
    if not isinstance(target, INT_TYPES):
        target = target.as_int
    factors = get_target_factors(target)
    assert len(factors) == 2
    p, q = map(IntegerBase, factors)
    p_digits = tuple(p.digits)
    q_digits = tuple(q.digits)

    num_found = 0

    for num_dig in sorted(frontiers.keys()):
        to_match = set([p_digits[-num_dig:], q_digits[-num_dig:]])
        frontier = frontiers[num_dig]
        for rank, node in enumerate(frontier):
            node_digits = set(map(tuple, [node.p.digits[-num_dig:], node.q.digits[-num_dig:]]))
            if to_match == node_digits:
                num_found += 1
#                assert num_found == 1
                print num_dig, rank + 1, len(frontier), BASE**(2*num_dig)
    assert num_found == 1
示例#3
0
def find_solution_root(frontiers, target):
    from verification import get_target_factors
    if not isinstance(target, INT_TYPES):
        target = target.as_int()
    factors = get_target_factors(target)
    assert len(factors) == 2
    p, q = map(IntegerBase.from_int, factors)
    p_digits = tuple(p._digits)
    q_digits = tuple(q._digits)

    num_found = 0

    for num_dig in sorted(frontiers.keys()):
        to_match = set([p_digits[:num_dig], q_digits[:num_dig]])
        frontier = frontiers[num_dig]
        for rank, node in enumerate(frontier):
            node_digits = set(map(tuple, [node.p._digits[:num_dig], node.q._digits[:num_dig]]))
            if to_match == node_digits:
                num_found += 1
                assert num_found == 1
                print num_dig, rank, len(frontier)
    assert num_found == 1
示例#4
0
def factorisation_summary(prod):
    ''' Print a summary of what's going on.
        >>> print factorisation_summary(143)
        Hamming distance: 2
        10001111 =
        1101 x
        1011

        >>> print factorisation_summary(536275525501)
        Hamming distance: 11
        111110011011100100000110001111101111101 =
        10000000000000110101 x
        11111001101100101001
    '''
    # Hack around the circular import
    from verification import get_target_factors

    summary = []
    p, q = get_target_factors(prod)
#    summary.append('Hamming distance: {}'.format(factor_binary_differences(p, q)))
    summary.append('{} =\n{} x\n{}'.format(bin(prod)[2:], bin(p)[2:], bin(q)[2:]))
    return '\n'.join(summary)