refactoring II
This commit is contained in:
122
LP/utils.py
Executable file
122
LP/utils.py
Executable file
@@ -0,0 +1,122 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: UTF-8 -*-
|
||||
import math
|
||||
|
||||
|
||||
def is_prime(num):
|
||||
if isinstance(num, str):
|
||||
num = int(num)
|
||||
if num in [2, 3, 5]:
|
||||
return True
|
||||
if num & 1 and num % 5 > 0:
|
||||
for i in range(2, math.floor(math.sqrt(num)) + 1):
|
||||
if i & 1 and (num % i) == 0:
|
||||
return False
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def rev(num): # or int(str(num)[::-1])
|
||||
if isinstance(num, str):
|
||||
num = int(num)
|
||||
revs = 0
|
||||
while (num > 0):
|
||||
remainder = num % 10
|
||||
revs = (revs * 10) + remainder
|
||||
num = num // 10
|
||||
return revs
|
||||
|
||||
|
||||
def is_emirp(num):
|
||||
return is_prime(rev(num))
|
||||
|
||||
|
||||
def power(x, y, p):
|
||||
res = 1
|
||||
x %= p
|
||||
while (y > 0):
|
||||
if (y & 1):
|
||||
res = (res * x) % p
|
||||
y = y >> 1
|
||||
x = (x * x) % p
|
||||
return res
|
||||
|
||||
|
||||
def sqrtNormal(n, p):
|
||||
n %= p
|
||||
for x in range(2, p):
|
||||
if ((x * x) % p == n):
|
||||
return x
|
||||
return None
|
||||
|
||||
|
||||
# Assumption: p is of the form 3*i + 4 where i >= 1
|
||||
def sqrtFast(n, p):
|
||||
if (p % 4 != 3):
|
||||
# raise ValueError('Invalid Input')
|
||||
return sqrtNormal(n, p)
|
||||
# Try "+(n ^ ((p + 1)/4))"
|
||||
n = n % p
|
||||
x = power(n, (p + 1) // 4, p)
|
||||
if ((x * x) % p == n):
|
||||
return x
|
||||
# Try "-(n ^ ((p + 1)/4))"
|
||||
x = p - x
|
||||
if ((x * x) % p == n):
|
||||
return x
|
||||
return None
|
||||
|
||||
|
||||
def elliptic_curve(x, a, b, r):
|
||||
y2 = (x ** 3 + a * x + b) % r
|
||||
y = sqrtFast(y2, r) if y2 > 0 else 0
|
||||
if y is None:
|
||||
return None, None
|
||||
return y, -y % r
|
||||
|
||||
|
||||
AFFINE_INV = None
|
||||
|
||||
|
||||
def affine_inverse(s, n=29):
|
||||
def fn(s, n):
|
||||
g = [n, s]
|
||||
u = [1, 0]
|
||||
v = [0, 1]
|
||||
y = [None]
|
||||
i = 1
|
||||
while g[i] != 0:
|
||||
y.append(g[i - 1] // g[i])
|
||||
g.append(g[i - 1] - y[i] * g[i])
|
||||
u.append(u[i - 1] - y[i] * u[i])
|
||||
v.append(v[i - 1] - y[i] * v[i])
|
||||
i += 1
|
||||
return v[-2] % n
|
||||
|
||||
global AFFINE_INV
|
||||
if AFFINE_INV is None:
|
||||
AFFINE_INV = [fn(x, n) for x in range(n)]
|
||||
return AFFINE_INV[s]
|
||||
|
||||
|
||||
def affine_decrypt(x, key, n=29): # key: (s, t)
|
||||
return ((x - key[1]) * affine_inverse(key[0], n)) % n
|
||||
|
||||
|
||||
def autokey_reverse(data, keylen, pos, search_term):
|
||||
ret = [29] * keylen
|
||||
for o in range(len(search_term)):
|
||||
plain = search_term[o]
|
||||
i = pos + o
|
||||
while i >= 0:
|
||||
plain = (data[i] - plain) % 29
|
||||
i -= keylen
|
||||
ret[i + keylen] = plain
|
||||
return ret
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
cipher = 'YDIDWYASDDJVAPJMMBIASDTJVAMD'
|
||||
indices = [affine_decrypt(alphabet.index(x), (5, 9), 26) for x in cipher]
|
||||
print(''.join(alphabet[x] for x in indices))
|
||||
Reference in New Issue
Block a user