modulus = 5237311370989869175293026848905079641021338739994243633972937865128169101571388346632361720473792365177258871486054600656048925740061347509722287043067341250552640264308621296888446513816907173362124418513727200975392177480577
|
|
|
|
assert(modulus.is_prime())
|
|
|
|
Fp = GF(modulus)
|
|
|
|
generator = Fp(0);
|
|
for i in range(0, 20):
|
|
i = Fp(i);
|
|
neg_i = Fp(-i)
|
|
if not(i.is_primitive_root() or neg_i.is_primitive_root()):
|
|
continue
|
|
elif i.is_primitive_root():
|
|
assert(i.is_primitive_root());
|
|
print("Generator: %d" % i)
|
|
generator = i
|
|
break
|
|
else:
|
|
assert(neg_i.is_primitive_root());
|
|
print("Generator: %d" % neg_i)
|
|
generator = neg_i
|
|
break
|
|
|
|
|
|
two_adicity = valuation(modulus - 1, 2);
|
|
trace = (modulus - 1) / 2**two_adicity;
|
|
two_adic_root_of_unity = generator^trace
|
|
print("2-adic Root of Unity: %d " % two_adic_root_of_unity)
|