first
This commit is contained in:
commit
1d6fa11fcf
9
.gitmodules
vendored
Normal file
9
.gitmodules
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[submodule "fgb_sage"]
|
||||||
|
path = fgb_sage
|
||||||
|
url = https://github.com/mwageringel/fgb_sage
|
||||||
|
[submodule "lattice-estimator"]
|
||||||
|
path = lattice-estimator
|
||||||
|
url = https://github.com/malb/lattice-estimator
|
||||||
|
[submodule "multivariate_quadratic_estimator"]
|
||||||
|
path = multivariate_quadratic_estimator
|
||||||
|
url = https://github.com/Crypto-TII/multivariate_quadratic_estimator
|
1
fgb_sage
Submodule
1
fgb_sage
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit ffeaa4ad3d98f223b4fc1eb697ff7ab6f3c54e5b
|
76
get_basis.sage
Normal file
76
get_basis.sage
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
from random import randint
|
||||||
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
F = GF(3301, names=("z", ))
|
||||||
|
|
||||||
|
f_a = list(F)
|
||||||
|
|
||||||
|
# m = 32
|
||||||
|
# n = 80
|
||||||
|
|
||||||
|
# m = 44
|
||||||
|
# n = 112
|
||||||
|
|
||||||
|
# m = 72
|
||||||
|
# n = 184
|
||||||
|
|
||||||
|
m = 8
|
||||||
|
n = 20
|
||||||
|
|
||||||
|
# m = 2
|
||||||
|
# n = 5
|
||||||
|
|
||||||
|
O = random_matrix(F, (n - m), m)
|
||||||
|
|
||||||
|
output = ""
|
||||||
|
poly_m = []
|
||||||
|
|
||||||
|
z = zero_matrix(F, m, (n - m))
|
||||||
|
|
||||||
|
for i in range(m):
|
||||||
|
|
||||||
|
P1 = random_matrix(F, (n - m), (n - m))
|
||||||
|
|
||||||
|
for j in range(0, len(P1.rows())):
|
||||||
|
for k in range(0, j):
|
||||||
|
P1[j, k] = 0
|
||||||
|
|
||||||
|
P2 = random_matrix(F, (n - m), m)
|
||||||
|
P3 = -O.T * P1 * O - O.T * P2
|
||||||
|
|
||||||
|
for j in range(0, len(P3.rows())):
|
||||||
|
for k in range(j+1, len(P3.rows())):
|
||||||
|
P3[j, k] += P3[k, j]
|
||||||
|
P3[k, j] = 0
|
||||||
|
|
||||||
|
for i in P1:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[2:]
|
||||||
|
|
||||||
|
for i in P2:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[2:]
|
||||||
|
|
||||||
|
for i in P3:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[2:]
|
||||||
|
|
||||||
|
P = block_matrix([ [P1, P2], [z, P3]])
|
||||||
|
poly_m.append(P)
|
||||||
|
|
||||||
|
v = matrix(F, n, 1, [randint(0, 1) for i in range(n)])
|
||||||
|
|
||||||
|
oil_basis = block_matrix(F, 2, 1, [O, identity_matrix(F, m)])
|
||||||
|
|
||||||
|
hint = [zero_matrix(F, n, 1) for i in range(1)]
|
||||||
|
|
||||||
|
value = zero_matrix(F, n, 1)
|
||||||
|
|
||||||
|
for i in oil_basis.columns():
|
||||||
|
for j in range(len(hint)):
|
||||||
|
hint[j] += F.random_element() * matrix(F, n, 1, list(i))
|
||||||
|
value += F.random_element() * matrix(F, n, 1, list(i))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
85
get_basis.sage.py
Normal file
85
get_basis.sage.py
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
|
||||||
|
|
||||||
|
# This file was *autogenerated* from the file get_basis.sage
|
||||||
|
from sage.all_cmdline import * # import sage library
|
||||||
|
|
||||||
|
_sage_const_3301 = Integer(3301); _sage_const_8 = Integer(8); _sage_const_20 = Integer(20); _sage_const_0 = Integer(0); _sage_const_1 = Integer(1); _sage_const_2 = Integer(2)
|
||||||
|
from random import randint
|
||||||
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
F = GF(_sage_const_3301 , names=("z", ))
|
||||||
|
|
||||||
|
f_a = list(F)
|
||||||
|
|
||||||
|
# m = 32
|
||||||
|
# n = 80
|
||||||
|
|
||||||
|
# m = 44
|
||||||
|
# n = 112
|
||||||
|
|
||||||
|
# m = 72
|
||||||
|
# n = 184
|
||||||
|
|
||||||
|
m = _sage_const_8
|
||||||
|
n = _sage_const_20
|
||||||
|
|
||||||
|
# m = 2
|
||||||
|
# n = 5
|
||||||
|
|
||||||
|
O = random_matrix(F, (n - m), m)
|
||||||
|
|
||||||
|
output = ""
|
||||||
|
poly_m = []
|
||||||
|
|
||||||
|
z = zero_matrix(F, m, (n - m))
|
||||||
|
|
||||||
|
for i in range(m):
|
||||||
|
|
||||||
|
P1 = random_matrix(F, (n - m), (n - m))
|
||||||
|
|
||||||
|
for j in range(_sage_const_0 , len(P1.rows())):
|
||||||
|
for k in range(_sage_const_0 , j):
|
||||||
|
P1[j, k] = _sage_const_0
|
||||||
|
|
||||||
|
P2 = random_matrix(F, (n - m), m)
|
||||||
|
P3 = -O.T * P1 * O - O.T * P2
|
||||||
|
|
||||||
|
for j in range(_sage_const_0 , len(P3.rows())):
|
||||||
|
for k in range(j+_sage_const_1 , len(P3.rows())):
|
||||||
|
P3[j, k] += P3[k, j]
|
||||||
|
P3[k, j] = _sage_const_0
|
||||||
|
|
||||||
|
for i in P1:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[_sage_const_2 :]
|
||||||
|
|
||||||
|
for i in P2:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[_sage_const_2 :]
|
||||||
|
|
||||||
|
for i in P3:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[_sage_const_2 :]
|
||||||
|
|
||||||
|
P = block_matrix([ [P1, P2], [z, P3]])
|
||||||
|
poly_m.append(P)
|
||||||
|
|
||||||
|
v = matrix(F, n, _sage_const_1 , [randint(_sage_const_0 , _sage_const_1 ) for i in range(n)])
|
||||||
|
|
||||||
|
oil_basis = block_matrix(F, _sage_const_2 , _sage_const_1 , [O, identity_matrix(F, m)])
|
||||||
|
|
||||||
|
hint = [zero_matrix(F, n, _sage_const_1 ) for i in range(_sage_const_1 )]
|
||||||
|
|
||||||
|
value = zero_matrix(F, n, _sage_const_1 )
|
||||||
|
|
||||||
|
for i in oil_basis.columns():
|
||||||
|
for j in range(len(hint)):
|
||||||
|
hint[j] += F.random_element() * matrix(F, n, _sage_const_1 , list(i))
|
||||||
|
value += F.random_element() * matrix(F, n, _sage_const_1 , list(i))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for P in poly_m:
|
||||||
|
print(value.T * (P + P.T) * hint[_sage_const_0 ])
|
||||||
|
|
||||||
|
|
1
lattice-estimator
Submodule
1
lattice-estimator
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit cf36315e7718b1e2e3de271b705697943ebaecf4
|
1
multivariate_quadratic_estimator
Submodule
1
multivariate_quadratic_estimator
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit ee5c7fe0aa0df737870bd4395003d9d83698fd21
|
159
recover_o.sage
Normal file
159
recover_o.sage
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
from random import randint
|
||||||
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
f_size = 3301
|
||||||
|
|
||||||
|
F = GF(f_size, names=("z", ))
|
||||||
|
|
||||||
|
f_a = list(F)
|
||||||
|
|
||||||
|
# m = 32
|
||||||
|
# n = 80
|
||||||
|
|
||||||
|
m = 44
|
||||||
|
n = 112
|
||||||
|
|
||||||
|
# m = 72
|
||||||
|
# n = 184
|
||||||
|
|
||||||
|
# m = 8
|
||||||
|
# n = 20
|
||||||
|
|
||||||
|
# m = 2
|
||||||
|
# n = 5
|
||||||
|
|
||||||
|
O = random_matrix(F, (n - m), m)
|
||||||
|
|
||||||
|
output = ""
|
||||||
|
poly_m = []
|
||||||
|
|
||||||
|
d = n / (m * log(f_size, 2).n())
|
||||||
|
N = ceil(sqrt((n + 1)/4)) + 1
|
||||||
|
print("d: ", d)
|
||||||
|
print("N: ", N)
|
||||||
|
|
||||||
|
z = zero_matrix(F, m, (n - m))
|
||||||
|
|
||||||
|
for i in tqdm(range(m)):
|
||||||
|
|
||||||
|
P1 = random_matrix(F, (n - m), (n - m))
|
||||||
|
|
||||||
|
for j in range(0, len(P1.rows())):
|
||||||
|
for k in range(0, j):
|
||||||
|
P1[j, k] = 0
|
||||||
|
|
||||||
|
P2 = random_matrix(F, (n - m), m)
|
||||||
|
P3 = -O.T * P1 * O - O.T * P2
|
||||||
|
|
||||||
|
for j in range(0, len(P3.rows())):
|
||||||
|
for k in range(j+1, len(P3.rows())):
|
||||||
|
P3[j, k] += P3[k, j]
|
||||||
|
P3[k, j] = 0
|
||||||
|
|
||||||
|
for i in P1:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[2:]
|
||||||
|
|
||||||
|
for i in P2:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[2:]
|
||||||
|
|
||||||
|
for i in P3:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[2:]
|
||||||
|
|
||||||
|
P = block_matrix([ [P1, P2], [z, P3]])
|
||||||
|
poly_m.append(P)
|
||||||
|
|
||||||
|
v = matrix(F, n, 1, [randint(0, 1) for i in range(n)])
|
||||||
|
|
||||||
|
oil_basis = block_matrix(F, 2, 1, [O, identity_matrix(F, m)])
|
||||||
|
|
||||||
|
o1 = zero_matrix(F, n, 1)
|
||||||
|
o2 = zero_matrix(F, n, 1)
|
||||||
|
|
||||||
|
for i in oil_basis.columns():
|
||||||
|
o1 += F.random_element() * matrix(F, n, 1, list(i))
|
||||||
|
o2 += F.random_element() * matrix(F, n, 1, list(i))
|
||||||
|
|
||||||
|
o_hat1 = v + o1
|
||||||
|
# o_hat2 = v + o2
|
||||||
|
|
||||||
|
print("o1 :", [i[0] for i in o1])
|
||||||
|
# print("o2 :", [i[0] for i in o2])
|
||||||
|
print("v :", [i[0] for i in v])
|
||||||
|
print("o1+v :", [i[0] for i in o_hat1])
|
||||||
|
# print("o2+v :", [i[0] for i in o_hat2])
|
||||||
|
|
||||||
|
print()
|
||||||
|
|
||||||
|
# for P in poly_m:
|
||||||
|
# print("oPo:", o1.T * P * o1)
|
||||||
|
# print("vPv:", v.T * P * v)
|
||||||
|
# print("qPq:", o_hat.T * P * o_hat)
|
||||||
|
# correction = o_hat.T * (P.T + P) * v
|
||||||
|
# print("oPx:", correction)
|
||||||
|
# print("tot:", v.T * P * v + o_hat.T * P * o_hat - correction)
|
||||||
|
# print()
|
||||||
|
# print()
|
||||||
|
|
||||||
|
|
||||||
|
# P = poly_m[0]
|
||||||
|
vec = [[(o_hat1.T * (P.T + P))[0][i] for i in range(n)] for P in poly_m]
|
||||||
|
s = [(v.T * P * v + o_hat1.T * P * o_hat1)[0][0] for P in poly_m]
|
||||||
|
|
||||||
|
# print("s: ", (v.T * P * v + o_hat.T * P * o_hat)[0][0])
|
||||||
|
# print("k: ", vec)
|
||||||
|
|
||||||
|
# out = 0
|
||||||
|
# for i in range(len(vec)):
|
||||||
|
# out += int(vec[i]) * int(v[i][0])
|
||||||
|
#
|
||||||
|
# t = matrix(QQ, 1, len(vec) + 2, [int(i[0]) for i in v] + [-(out // 3301), -1])
|
||||||
|
# print("t: ", t)
|
||||||
|
|
||||||
|
d = n / (m * log(f_size, 2).n())
|
||||||
|
N = ceil(sqrt((n + 1)/4)) + 1
|
||||||
|
print("d: ", d)
|
||||||
|
print("N: ", N)
|
||||||
|
|
||||||
|
b1 = identity_matrix(QQ, n)
|
||||||
|
b2 = zero_matrix(QQ, n, 1)
|
||||||
|
b3 = matrix(QQ, m, n, [[N * int(i) for i in j] for j in vec]).T
|
||||||
|
b4 = zero_matrix(QQ, m, n)
|
||||||
|
b5 = zero_matrix(QQ, m, 1)
|
||||||
|
b6 = N * f_size * identity_matrix(QQ, m)
|
||||||
|
b7 = matrix(QQ, 1, n, [1/2]*n)
|
||||||
|
b8 = matrix(QQ, 1, 1, [1/2])
|
||||||
|
b9 = matrix(QQ, 1, m, [N * int(i) for i in s])
|
||||||
|
|
||||||
|
|
||||||
|
B = block_matrix([[b1, b2, b3], [b4, b5, b6], [b7, b8, b9]])
|
||||||
|
|
||||||
|
print(B)
|
||||||
|
print()
|
||||||
|
|
||||||
|
BH = B.LLL()
|
||||||
|
|
||||||
|
BH = matrix(ZZ, 2 * BH)
|
||||||
|
|
||||||
|
print(BH)
|
||||||
|
|
||||||
|
for beta in tqdm(range(0, 10)):
|
||||||
|
BH = BH.BKZ(block_size=beta + 1, fp='rr', precision=200)
|
||||||
|
|
||||||
|
BH = 1/2 * matrix(QQ, BH)
|
||||||
|
|
||||||
|
print(BH)
|
||||||
|
print()
|
||||||
|
for out_vec in BH:
|
||||||
|
if abs(out_vec[-(m + 1)]) == 1/2:
|
||||||
|
if out_vec[-(m + 1)] == -1/2:
|
||||||
|
testvec = [i + 1/2 for i in out_vec]
|
||||||
|
else:
|
||||||
|
testvec = [i + 1/2 for i in -out_vec]
|
||||||
|
|
||||||
|
print(testvec)
|
||||||
|
|
||||||
|
print()
|
||||||
|
print([i[0] for i in v])
|
164
recover_o.sage.py
Normal file
164
recover_o.sage.py
Normal file
|
@ -0,0 +1,164 @@
|
||||||
|
|
||||||
|
|
||||||
|
# This file was *autogenerated* from the file recover_o.sage
|
||||||
|
from sage.all_cmdline import * # import sage library
|
||||||
|
|
||||||
|
_sage_const_3301 = Integer(3301); _sage_const_44 = Integer(44); _sage_const_112 = Integer(112); _sage_const_2 = Integer(2); _sage_const_1 = Integer(1); _sage_const_4 = Integer(4); _sage_const_0 = Integer(0); _sage_const_10 = Integer(10); _sage_const_200 = Integer(200)
|
||||||
|
from random import randint
|
||||||
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
F = GF(_sage_const_3301 , names=("z", ))
|
||||||
|
|
||||||
|
f_a = list(F)
|
||||||
|
|
||||||
|
# m = 32
|
||||||
|
# n = 80
|
||||||
|
|
||||||
|
m = _sage_const_44
|
||||||
|
n = _sage_const_112
|
||||||
|
|
||||||
|
# m = 72
|
||||||
|
# n = 184
|
||||||
|
|
||||||
|
# m = 8
|
||||||
|
# n = 20
|
||||||
|
|
||||||
|
# m = 2
|
||||||
|
# n = 5
|
||||||
|
|
||||||
|
O = random_matrix(F, (n - m), m)
|
||||||
|
|
||||||
|
output = ""
|
||||||
|
poly_m = []
|
||||||
|
|
||||||
|
d = n / (m * log(_sage_const_3301 , _sage_const_2 ).n())
|
||||||
|
N = ceil(sqrt((n + _sage_const_1 )/_sage_const_4 )) + _sage_const_1
|
||||||
|
print("d: ", d)
|
||||||
|
print("N: ", N)
|
||||||
|
|
||||||
|
z = zero_matrix(F, m, (n - m))
|
||||||
|
|
||||||
|
for i in tqdm(range(m)):
|
||||||
|
|
||||||
|
P1 = random_matrix(F, (n - m), (n - m))
|
||||||
|
|
||||||
|
for j in range(_sage_const_0 , len(P1.rows())):
|
||||||
|
for k in range(_sage_const_0 , j):
|
||||||
|
P1[j, k] = _sage_const_0
|
||||||
|
|
||||||
|
P2 = random_matrix(F, (n - m), m)
|
||||||
|
P3 = -O.T * P1 * O - O.T * P2
|
||||||
|
|
||||||
|
for j in range(_sage_const_0 , len(P3.rows())):
|
||||||
|
for k in range(j+_sage_const_1 , len(P3.rows())):
|
||||||
|
P3[j, k] += P3[k, j]
|
||||||
|
P3[k, j] = _sage_const_0
|
||||||
|
|
||||||
|
for i in P1:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[_sage_const_2 :]
|
||||||
|
|
||||||
|
for i in P2:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[_sage_const_2 :]
|
||||||
|
|
||||||
|
for i in P3:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[_sage_const_2 :]
|
||||||
|
|
||||||
|
P = block_matrix([ [P1, P2], [z, P3]])
|
||||||
|
poly_m.append(P)
|
||||||
|
|
||||||
|
v = matrix(F, n, _sage_const_1 , [randint(_sage_const_0 , _sage_const_1 ) for i in range(n)])
|
||||||
|
|
||||||
|
oil_basis = block_matrix(F, _sage_const_2 , _sage_const_1 , [O, identity_matrix(F, m)])
|
||||||
|
|
||||||
|
o1 = zero_matrix(F, n, _sage_const_1 )
|
||||||
|
o2 = zero_matrix(F, n, _sage_const_1 )
|
||||||
|
|
||||||
|
for i in oil_basis.columns():
|
||||||
|
o1 += F.random_element() * matrix(F, n, _sage_const_1 , list(i))
|
||||||
|
o2 += F.random_element() * matrix(F, n, _sage_const_1 , list(i))
|
||||||
|
|
||||||
|
o_hat1 = v + o1
|
||||||
|
# o_hat2 = v + o2
|
||||||
|
|
||||||
|
print("o1 :", [i[_sage_const_0 ] for i in o1])
|
||||||
|
# print("o2 :", [i[0] for i in o2])
|
||||||
|
print("v :", [i[_sage_const_0 ] for i in v])
|
||||||
|
print("o1+v :", [i[_sage_const_0 ] for i in o_hat1])
|
||||||
|
# print("o2+v :", [i[0] for i in o_hat2])
|
||||||
|
|
||||||
|
print()
|
||||||
|
|
||||||
|
# for P in poly_m:
|
||||||
|
# print("oPo:", o1.T * P * o1)
|
||||||
|
# print("vPv:", v.T * P * v)
|
||||||
|
# print("qPq:", o_hat.T * P * o_hat)
|
||||||
|
# correction = o_hat.T * (P.T + P) * v
|
||||||
|
# print("oPx:", correction)
|
||||||
|
# print("tot:", v.T * P * v + o_hat.T * P * o_hat - correction)
|
||||||
|
# print()
|
||||||
|
# print()
|
||||||
|
|
||||||
|
|
||||||
|
# P = poly_m[0]
|
||||||
|
vec = [[(o_hat1.T * (P.T + P))[_sage_const_0 ][i] for i in range(n)] for P in poly_m]
|
||||||
|
s = [(v.T * P * v + o_hat1.T * P * o_hat1)[_sage_const_0 ][_sage_const_0 ] for P in poly_m]
|
||||||
|
|
||||||
|
# print("s: ", (v.T * P * v + o_hat.T * P * o_hat)[0][0])
|
||||||
|
# print("k: ", vec)
|
||||||
|
|
||||||
|
# out = 0
|
||||||
|
# for i in range(len(vec)):
|
||||||
|
# out += int(vec[i]) * int(v[i][0])
|
||||||
|
#
|
||||||
|
# t = matrix(QQ, 1, len(vec) + 2, [int(i[0]) for i in v] + [-(out // 3301), -1])
|
||||||
|
# print("t: ", t)
|
||||||
|
|
||||||
|
d = n / (m * log(_sage_const_3301 , _sage_const_2 ).n())
|
||||||
|
N = ceil(sqrt((n + _sage_const_1 )/_sage_const_4 )) + _sage_const_1
|
||||||
|
print("d: ", d)
|
||||||
|
print("N: ", N)
|
||||||
|
|
||||||
|
b1 = identity_matrix(QQ, n)
|
||||||
|
b2 = zero_matrix(QQ, n, _sage_const_1 )
|
||||||
|
b3 = matrix(QQ, m, n, [[N * int(i) for i in j] for j in vec]).T
|
||||||
|
b4 = zero_matrix(QQ, m, n)
|
||||||
|
b5 = zero_matrix(QQ, m, _sage_const_1 )
|
||||||
|
b6 = N * _sage_const_3301 * identity_matrix(QQ, m)
|
||||||
|
b7 = matrix(QQ, _sage_const_1 , n, [_sage_const_1 /_sage_const_2 ]*n)
|
||||||
|
b8 = matrix(QQ, _sage_const_1 , _sage_const_1 , [_sage_const_1 /_sage_const_2 ])
|
||||||
|
b9 = matrix(QQ, _sage_const_1 , m, [N * int(i) for i in s])
|
||||||
|
|
||||||
|
|
||||||
|
B = block_matrix([[b1, b2, b3], [b4, b5, b6], [b7, b8, b9]])
|
||||||
|
|
||||||
|
print(B)
|
||||||
|
print()
|
||||||
|
|
||||||
|
BH = B.LLL()
|
||||||
|
|
||||||
|
BH = matrix(ZZ, _sage_const_2 * BH)
|
||||||
|
|
||||||
|
print(BH)
|
||||||
|
|
||||||
|
for beta in tqdm(range(_sage_const_0 , _sage_const_10 )):
|
||||||
|
BH = BH.BKZ(block_size=beta + _sage_const_1 , fp='rr', precision=_sage_const_200 )
|
||||||
|
|
||||||
|
BH = _sage_const_1 /_sage_const_2 * matrix(QQ, BH)
|
||||||
|
|
||||||
|
print(BH)
|
||||||
|
print()
|
||||||
|
for out_vec in BH:
|
||||||
|
if abs(out_vec[-(m + _sage_const_1 )]) == _sage_const_1 /_sage_const_2 :
|
||||||
|
if out_vec[-(m + _sage_const_1 )] == -_sage_const_1 /_sage_const_2 :
|
||||||
|
testvec = [i + _sage_const_1 /_sage_const_2 for i in out_vec]
|
||||||
|
else:
|
||||||
|
testvec = [i + _sage_const_1 /_sage_const_2 for i in -out_vec]
|
||||||
|
|
||||||
|
print(testvec)
|
||||||
|
|
||||||
|
print()
|
||||||
|
print([i[_sage_const_0 ] for i in v])
|
||||||
|
|
107
test_f5.sage
Normal file
107
test_f5.sage
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
from random import randint
|
||||||
|
from tqdm import tqdm
|
||||||
|
from sage.rings.polynomial.msolve import variety as msolve_variety
|
||||||
|
|
||||||
|
F = GF(3301, names=("z", ))
|
||||||
|
|
||||||
|
f_a = list(F)
|
||||||
|
|
||||||
|
# m = 32
|
||||||
|
# n = 80
|
||||||
|
|
||||||
|
# m = 44
|
||||||
|
# n = 112
|
||||||
|
|
||||||
|
# m = 72
|
||||||
|
# n = 184
|
||||||
|
|
||||||
|
# m = 8
|
||||||
|
# n = 20
|
||||||
|
|
||||||
|
# m = 2
|
||||||
|
# n = 5
|
||||||
|
|
||||||
|
m = 44
|
||||||
|
n = 112
|
||||||
|
|
||||||
|
|
||||||
|
print("vars: ", n)
|
||||||
|
print("eqns: ", m)
|
||||||
|
|
||||||
|
print("actual vars: ", n - m)
|
||||||
|
print("actual eqns: ", m + m)
|
||||||
|
|
||||||
|
O = random_matrix(F, (n - m), m)
|
||||||
|
|
||||||
|
output = ""
|
||||||
|
poly_m = []
|
||||||
|
|
||||||
|
z = zero_matrix(F, m, (n - m))
|
||||||
|
|
||||||
|
for i in tqdm(range(m)):
|
||||||
|
|
||||||
|
P1 = random_matrix(F, (n - m), (n - m))
|
||||||
|
|
||||||
|
for j in range(0, len(P1.rows())):
|
||||||
|
for k in range(0, j): P1[j, k] = 0
|
||||||
|
P2 = random_matrix(F, (n - m), m)
|
||||||
|
P3 = -O.T * P1 * O - O.T * P2
|
||||||
|
|
||||||
|
for j in range(0, len(P3.rows())):
|
||||||
|
for k in range(j+1, len(P3.rows())):
|
||||||
|
P3[j, k] += P3[k, j]
|
||||||
|
P3[k, j] = 0
|
||||||
|
|
||||||
|
for i in P1:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[2:]
|
||||||
|
|
||||||
|
for i in P2:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[2:]
|
||||||
|
|
||||||
|
for i in P3:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[2:]
|
||||||
|
|
||||||
|
P = block_matrix([ [P1, P2], [z, P3]])
|
||||||
|
poly_m.append(P)
|
||||||
|
|
||||||
|
v = matrix(F, n, 1, [randint(0, 1) for i in range(n)])
|
||||||
|
|
||||||
|
oil_basis = block_matrix(F, 2, 1, [O, identity_matrix(F, m)])
|
||||||
|
|
||||||
|
var_list = ','.join([f'x{i}' for i in range(n - m)])
|
||||||
|
R = PolynomialRing(F, var_list)
|
||||||
|
|
||||||
|
|
||||||
|
value = zero_matrix(R, n, 1)
|
||||||
|
hint = zero_matrix(R, n, 1)
|
||||||
|
hint2 = zero_matrix(R, n, 1)
|
||||||
|
|
||||||
|
for i in oil_basis.columns():
|
||||||
|
value += F.random_element() * matrix(F, n, 1, list(i))
|
||||||
|
hint += F.random_element() * matrix(F, n, 1, list(i))
|
||||||
|
hint2 += F.random_element() * matrix(F, n, 1, list(i))
|
||||||
|
|
||||||
|
print(value)
|
||||||
|
|
||||||
|
print()
|
||||||
|
print(n - m)
|
||||||
|
|
||||||
|
print()
|
||||||
|
for i in range(n - m):
|
||||||
|
value[i] = R(f'x{i}')
|
||||||
|
|
||||||
|
polys = []
|
||||||
|
for i in poly_m:
|
||||||
|
polys.append((value.T * i * value)[0][0])
|
||||||
|
polys.append((value.T * (i + i.T) * hint)[0][0])
|
||||||
|
polys.append((value.T * (i + i.T) * hint2)[0][0])
|
||||||
|
|
||||||
|
I = R.ideal(*polys)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print(msolve_variety(I, F, proof=False))
|
||||||
|
|
114
test_f5.sage.py
Normal file
114
test_f5.sage.py
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
|
||||||
|
|
||||||
|
# This file was *autogenerated* from the file test_f5.sage
|
||||||
|
from sage.all_cmdline import * # import sage library
|
||||||
|
|
||||||
|
_sage_const_3301 = Integer(3301); _sage_const_44 = Integer(44); _sage_const_112 = Integer(112); _sage_const_0 = Integer(0); _sage_const_1 = Integer(1); _sage_const_2 = Integer(2)
|
||||||
|
from random import randint
|
||||||
|
from tqdm import tqdm
|
||||||
|
from sage.rings.polynomial.msolve import variety as msolve_variety
|
||||||
|
|
||||||
|
F = GF(_sage_const_3301 , names=("z", ))
|
||||||
|
|
||||||
|
f_a = list(F)
|
||||||
|
|
||||||
|
# m = 32
|
||||||
|
# n = 80
|
||||||
|
|
||||||
|
# m = 44
|
||||||
|
# n = 112
|
||||||
|
|
||||||
|
# m = 72
|
||||||
|
# n = 184
|
||||||
|
|
||||||
|
# m = 8
|
||||||
|
# n = 20
|
||||||
|
|
||||||
|
# m = 2
|
||||||
|
# n = 5
|
||||||
|
|
||||||
|
m = _sage_const_44
|
||||||
|
n = _sage_const_112
|
||||||
|
|
||||||
|
|
||||||
|
print("vars: ", n)
|
||||||
|
print("eqns: ", m)
|
||||||
|
|
||||||
|
print("actual vars: ", n - m)
|
||||||
|
print("actual eqns: ", m + m)
|
||||||
|
|
||||||
|
O = random_matrix(F, (n - m), m)
|
||||||
|
|
||||||
|
output = ""
|
||||||
|
poly_m = []
|
||||||
|
|
||||||
|
z = zero_matrix(F, m, (n - m))
|
||||||
|
|
||||||
|
for i in tqdm(range(m)):
|
||||||
|
|
||||||
|
P1 = random_matrix(F, (n - m), (n - m))
|
||||||
|
|
||||||
|
for j in range(_sage_const_0 , len(P1.rows())):
|
||||||
|
for k in range(_sage_const_0 , j): P1[j, k] = _sage_const_0
|
||||||
|
P2 = random_matrix(F, (n - m), m)
|
||||||
|
P3 = -O.T * P1 * O - O.T * P2
|
||||||
|
|
||||||
|
for j in range(_sage_const_0 , len(P3.rows())):
|
||||||
|
for k in range(j+_sage_const_1 , len(P3.rows())):
|
||||||
|
P3[j, k] += P3[k, j]
|
||||||
|
P3[k, j] = _sage_const_0
|
||||||
|
|
||||||
|
for i in P1:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[_sage_const_2 :]
|
||||||
|
|
||||||
|
for i in P2:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[_sage_const_2 :]
|
||||||
|
|
||||||
|
for i in P3:
|
||||||
|
for j in i:
|
||||||
|
output += hex(f_a.index(j))[_sage_const_2 :]
|
||||||
|
|
||||||
|
P = block_matrix([ [P1, P2], [z, P3]])
|
||||||
|
poly_m.append(P)
|
||||||
|
|
||||||
|
v = matrix(F, n, _sage_const_1 , [randint(_sage_const_0 , _sage_const_1 ) for i in range(n)])
|
||||||
|
|
||||||
|
oil_basis = block_matrix(F, _sage_const_2 , _sage_const_1 , [O, identity_matrix(F, m)])
|
||||||
|
|
||||||
|
var_list = ','.join([f'x{i}' for i in range(n - m)])
|
||||||
|
R = PolynomialRing(F, var_list)
|
||||||
|
|
||||||
|
|
||||||
|
value = zero_matrix(R, n, _sage_const_1 )
|
||||||
|
hint = zero_matrix(R, n, _sage_const_1 )
|
||||||
|
hint2 = zero_matrix(R, n, _sage_const_1 )
|
||||||
|
|
||||||
|
for i in oil_basis.columns():
|
||||||
|
value += F.random_element() * matrix(F, n, _sage_const_1 , list(i))
|
||||||
|
hint += F.random_element() * matrix(F, n, _sage_const_1 , list(i))
|
||||||
|
hint2 += F.random_element() * matrix(F, n, _sage_const_1 , list(i))
|
||||||
|
|
||||||
|
print(value)
|
||||||
|
|
||||||
|
print()
|
||||||
|
print(n - m)
|
||||||
|
|
||||||
|
print()
|
||||||
|
for i in range(n - m):
|
||||||
|
value[i] = R(f'x{i}')
|
||||||
|
|
||||||
|
polys = []
|
||||||
|
for i in poly_m:
|
||||||
|
polys.append((value.T * i * value)[_sage_const_0 ][_sage_const_0 ])
|
||||||
|
polys.append((value.T * (i + i.T) * hint)[_sage_const_0 ][_sage_const_0 ])
|
||||||
|
polys.append((value.T * (i + i.T) * hint2)[_sage_const_0 ][_sage_const_0 ])
|
||||||
|
|
||||||
|
I = R.ideal(*polys)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print(msolve_variety(I, F, proof=False))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user