make it faster yet
This commit is contained in:
42
res/07_weird_assembly_machine.sage
Normal file
42
res/07_weird_assembly_machine.sage
Normal file
@@ -0,0 +1,42 @@
|
||||
F = GF(2)
|
||||
R.<x> = PolynomialRing(F)
|
||||
S.<xi> = R.quotient_ring(x^64 + 1)
|
||||
T.<X> = PolynomialRing(S)
|
||||
Ti.<Xi> = T.quotient_ring(X^64 + 1)
|
||||
Tj.<Xj> = T.quotient_ring(X^64)
|
||||
|
||||
def num_to_poly(num):
|
||||
out = 0
|
||||
i = 0
|
||||
while num != 0:
|
||||
if num % 2 == 1:
|
||||
out += xi^i
|
||||
i += 1
|
||||
num //= 2
|
||||
return out
|
||||
|
||||
def poly_to_num(poly):
|
||||
out = 0
|
||||
for i in range(0, 64):
|
||||
if poly[i] == 1:
|
||||
out |= 1 << i
|
||||
return out
|
||||
|
||||
|
||||
with open("./07_weird_assembly_machine.data") as f:
|
||||
data = [int(line) for line in f.readlines() if line]
|
||||
|
||||
f = reduce(lambda a, b: a * X + b, [num_to_poly(a) for a in data[:128]])
|
||||
g = reduce(lambda a, b: a * X + b, [num_to_poly(a) for a in data[128:]])
|
||||
|
||||
fg = f(g)
|
||||
fgi = Ti([fg[i] for i in range(0, fg.degree())])
|
||||
fgj = Tj([fg[j] for i in range(0, fg.degree())])
|
||||
|
||||
print("\n\n======= f(g(x)) =======")
|
||||
for i in reversed(range(0, 64)):
|
||||
print(poly_to_num(fgi.lift()[i]))
|
||||
|
||||
print("\n\n======= f(g(x)) =======")
|
||||
for i in reversed(range(0, 64)):
|
||||
print(poly_to_num(fgj.lift()[i]))
|
Reference in New Issue
Block a user