from sagelib.multiplication import *
from sagelib.division import *
from sagelib.frobenius import print_quadratic_non_residues, print_frobenius_coeffs
from sagelib.g1 import *
from sagelib.g2 import *
from sagelib.utils import *
def generate_reference_json():
import json
num_points = 1000
points = {
"g1": {'a': [], 'b': [], 'r': [], 'add': [], 'dbl': [], 'mul': [], 'svdw': []},
"g2": {'a': [], 'b': [], 'r': [], 'add': [], 'dbl': [], 'mul': [], 'invalid': [], 'psi': []},
}
for func, curve, label in zip([generate_g1_data, generate_g2_data], [E1, E2], ['g1', 'g2']):
A, B, R, Add, Dbl, Mul = func(num_points)
svdw = generic_svdw(curve)
if label=='g1':
for _ in range(num_points):
u = Fp.random_element()
if u not in svdw.undefs:
x, y = svdw.map_to_point(u)
assert curve(x,y), f"point ({x},{y}) is not on curve {curve} for u={u}"
points[label]['svdw'].append({
"i": str(u),
**point_to_json(curve(x,y))
})
for _a, _b, _r, _add, _dbl, _mul in zip(A, B, R, Add, Dbl, Mul):
points[label]['a'].append(point_to_json(_a))
points[label]['b'].append(point_to_json(_b))
points[label]['r'].append(str(int(_r)))
points[label]['add'].append(point_to_json(_add))
points[label]['dbl'].append(point_to_json(_dbl))
points[label]['mul'].append(point_to_json(_mul))
if label=='g2':
points[label]['psi'].append(point_to_json(endomorphism(_a)))
for _ in range(num_points):
points["g2"]['invalid'].append(point_to_json(generate_non_r_torsion_point()))
with open('../bn254_reference.json', 'w') as f:
f.write(json.dumps(points,indent=2))
if __name__ == "__main__":
logging.info("*" * 20 + "Mul tests" + "*" * 20)
for instance in [
FieldMultiplicationTest(),
QuadraticFieldMultiplicationTest(),
SexticFieldMultiplicationTest(),
]:
for method_name in dir(instance):
if method_name.startswith("test_"):
getattr(instance, method_name)()
logging.info("All multiplication tests passed successfully!")
logging.info("*" * 20 + "Div tests" + "*" * 20)
for instance in [
FieldDivisionTest(),
QuadraticFieldDivisionTest(),
SexticFieldDivisionTest(),
]:
for method_name in dir(instance):
if method_name.startswith("test_"):
getattr(instance, method_name)()
logging.info("All division tests passed successfully!")
print_quadratic_non_residues()
print_frobenius_coeffs()
generate_reference_json()