예제 #1
0
def encrypt(text, key):
    binary_text = misc.text_to_bits(text)
    binary_text = textwrap.wrap(binary_text, 64)

    last_text_part = binary_text[len(binary_text) - 1]
    binary_text[len(binary_text) - 1] = last_text_part + ''.zfill(64-len(last_text_part))

    subkeys = conversion.primary_key_to_subkeys(key)

    for part_num, part in enumerate(binary_text):
        part = permutations.permutation(part, "initial")
        lpt, rpt = part[:int(len(part) / 2)], part[int(len(part) / 2):]
        for i in range(16):
            lpt, rpt = rpt, misc.binary_addition(lpt, function(rpt, subkeys[0]), 32)
        binary_text[part_num] = permutations.permutation(rpt + lpt, "inverse")
    return ''.join(binary_text)
예제 #2
0
def findPanPrime():
    for d in range(8, 1, -1):
        digits = [x for x in range(1, d)]
        digits.reverse()
        if sum(digits) % 3 == 0:
            continue
        for p in permutation(digits, len(digits)):
            if p[-1] not in BAD_END_NUMS:
                n = int("".join([str(x) for x in p]))
                if primeCheckII.PrimeCheck(n):
                    return (n)
예제 #3
0
def findSpecialPrimes():
    checked_list = []
    for prime in primeCheckII.primes(1000,10000):
        #print(prime)
        for p in permutation([x for x in range(len(str(prime)))],len(str(prime))):
            s = [str(prime)[x] for x in p]
            next_prime = int("".join(s))
            if len(str(next_prime)) < PRIME_LENGTH or next_prime <= prime:
                continue
            if primeCheckII.PrimeCheck(next_prime):
                d_prime = next_prime - prime
                last_prime = next_prime + d_prime
                if len(str(last_prime)) != PRIME_LENGTH:
                    continue
                if primeCheckII.PrimeCheck(last_prime):
                    if Counter([s for s in str(last_prime)]) == Counter(s):
                        if prime not in checked_list:
                            checked_list.append(prime)
                            yield([prime,next_prime,last_prime])
def computeUniqueCombos(digit_list, n, min_prime=2):
    if len(digit_list) == 0:
        yield ([])
    set_list = []
    for x in permutation(digit_list, n):
        x_str = ''
        for i in x:
            x_str += str(i)
        X = int(x_str)
        if X >= min_prime:
            new_digit_list = [i for i in digit_list if i not in x]
            if not isPrime(X):
                continue
            else:
                if len(new_digit_list) == 0:
                    set_list.append([X])
                else:
                    for N in range(n, len(new_digit_list) + 1):
                        for y in computeUniqueCombos(new_digit_list, N, X):
                            set_list.append([X] + y)
    for item in set_list:
        yield (item)
예제 #5
0
def primary_key_to_subkeys(key):
    subkeys = []

    binary_prim_key = misc.hex_to_bits(key)
    binary_prim_key = ''.join(
        [binary_prim_key[i:i + 7] for i in range(0, len(binary_prim_key), 8)])

    left_part, right_part = binary_prim_key[:int(
        len(binary_prim_key) /
        2)], binary_prim_key[int(len(binary_prim_key) / 2):]
    for i in range(16):
        if i == 0 \
                or i == 1 \
                or i == 8 \
                or i == 15:
            left_part = misc.left_shift(left_part, 1)
            right_part = misc.left_shift(right_part, 1)
        else:
            left_part = misc.left_shift(left_part, 2)
            right_part = misc.left_shift(right_part, 2)
        subkeys.append(
            permutations.permutation(left_part + right_part, "compression"))
    return subkeys
 def test_example(self):
     expected = [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2],
                 [3, 2, 1]]
     actual = permutations.permutation([1, 2, 3])
     self.assertEqual(actual, expected)
예제 #7
0
def function(rpt, subkey):
    rpt = permutations.permutation(rpt, "expansion")
    rpt = misc.XOR(rpt, subkey)
    rpt = permutations.sBox_permutation(rpt)
    rpt = permutations.permutation(rpt, "pBox")
    return rpt
# PROJECT EULER PROBLEM 24 - Lexicographic Permutations

from permutations import permutation

digits = [x for x in range(10)]
for i, p in enumerate(permutation(digits, len(digits))):
    if i + 1 == 1000000:
        x = int("".join([str(j) for j in p]))
        print(x)
        break
예제 #9
0
파일: p24.py 프로젝트: benwarner/euler
# What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?

import permutations

print(permutations.permutation([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 999999)) # My permutation finder is zero-based.
예제 #10
0
 def test_small_permutations(self):
     self.data = ["0", "1", "2"]
     self.index = 6 - 1
     result = permutations.permutation(self.index, self.data)
     self.assertEqual(result, "210")
예제 #11
0
 def test_permutations(self):
     self.data = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
     self.index = 1000000 - 1
     result = permutations.permutation(self.index, self.data)
     self.assertEqual(result, "2783915460")
     print("Result: {0}".format(result))
예제 #12
0
파일: 12.3.py 프로젝트: hajdusia/python
#!/usr/bin/python
# -*- coding: utf-8 -*-
import permutations


def mediana(data):
    n = len(data)
    sorted_data = sorted(data)
    if n < 1:
        return None
    if n % 2 == 1:
        return sorted_data[n // 2]  # integer division
    else:
        return (sorted_data[n // 2 - 1] + sorted_data[n // 2]) / 2.0


if __name__ == "__main__":
    items = permutations.permutation(10)
    print mediana(items)
예제 #13
0
prime_list = [p for p in primes(2, 18)]

results = []
for digit3 in GOOD3:
    digit_list = [x for x in range(10)]
    new_num = ['X' for x in range(10)]
    new_num[3] = digit3
    digit_list.remove(digit3)
    for digit5 in GOOD5:
        new_digit_list = digit_list[:]
        if digit3 == digit5:
            continue
        new_num[5] = digit5
        new_digit_list.remove(digit5)
        for p in permutation(new_digit_list, len(new_digit_list)):
            num = ''
            for d in new_num:
                if d == 'X':
                    num += str(p.pop(0))
                else:
                    num += str(d)

            good_num = True
            for d in range(1, 8):
                val = int(num[d:d + 3])
                if val % prime_list[d - 1] != 0:
                    good_num = False
                    break
            if good_num:
                results.append(int(num))
예제 #14
0
# PROJECT EULER PROBLEM 32 - Pandigital Products
from permutations import permutation

digits = [i for i in range(1, 10)]

final_result_dict = {}
product_sum = 0
for n in range(1, 3):
    m = 5 - n
    for p in permutation(digits, n):
        if p == [1]:
            continue
        new_digits = [x for x in digits if x not in p]
        for q in permutation(new_digits, m):
            r = [x for x in new_digits if x not in q]
            multiplicand = int("".join([str(i) for i in p]))
            multiplier = int("".join([str(i) for i in q]))
            result = multiplicand * multiplier
            if result > 9999:
                continue
            result_list = sorted([i for i in str(result)])
            if '0' in result_list:
                continue
            product_list = sorted([str(i) for i in r])
            if product_list == result_list:
                if result not in final_result_dict:
                    final_result_dict[result] = [multiplicand, multiplier]
                    product_sum += result

print(final_result_dict)
print(product_sum)