Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

The Sage assignment of the MasterMath course Algebraic Number Theory, 2017 fall. Author: Koen van Duin and Ju-Feng Wu

Views: 52
Kernel: SageMath (stable)
# =================================== Problem 1.1 =========================== K.<a>=QuadraticField(101) i=161201*a+1620050 j=64802401*a-651256070 I=K.ideal(i) J=K.ideal(j) print 1 in I print 1 in J
True True
unit=K.unit_group() unit eta=unit.gens()[1] unit(i) unit(j)
u1^7
print i^(-7)==j^5
True
# =================================== Problem 1.2 =========================== R.<x> = PolynomialRing(Rationals()) K.<a> = NumberField(x^2-1621) units = K.unit_group() units gen = units.gens() # gives a list of generators. eta0 = gen[0] eta1 = gen[1] print "We have " + str(len(gen)) + " generators." print "eta0's value is " + str(eta0.value()) print "eta1's value is " + str(eta1.value()) print "Therefore eta1 is a fundamental unit in the maximal order, by Dirichlet's unit theorem." print "We wanted an element in ZZ[sqrt(1621)] though." A=ZZ[a]; i=0 eta=eta1 while eta not in A: #or norm(eta1.value()) != -1: eta=K(eta*eta1) i=i+1 eta eta in A print eta print 'eta=eta1^' + str(i) print "The first power of eta1 that lies in Z[sqrt{1621}] is equal to eta^" + str(i) + "." print "its value is " + str(K(eta)) + "." print "It has norm " + str(norm(K(eta))) + "." eta = K(eta^2) print "Therefore we square, and get " + str(eta) + "."
We have 2 generators. eta0's value is -1 eta1's value is 119806883557/2*a - 4823622127875/2 Therefore eta1 is a fundamental unit in the maximal order, by Dirichlet's unit theorem. We wanted an element in ZZ[sqrt(1621)] though. 1393793173905903098261469193463230841*a - 56116404965454319198851772383057215250 eta=eta1^2 The first power of eta1 that lies in Z[sqrt{1621}] is equal to eta^2. its value is 1393793173905903098261469193463230841*a - 56116404965454319198851772383057215250. It has norm -1. Therefore we square, and get -156429324369979112128445583345098338627552043874824108399177922442751050500*a + 6298101812493732343034974500091457815529942308667051412857352310169665125001.
# =================================== Problem 2.1+2 =========================== N = 61 # For more flexibility we make sure we can change this 60. nl = [n for n in range(2, N) if n%2==0] # nl stands for "number list" rtl = [] # rtl stands for "run time list." import time startTime = time.time() tl = [startTime] # tl stands for "time list". for n in nl: K=CyclotomicField(n) G=K.class_group(proof = False) theTime = time.time() tl.append(theTime) if G.order()>1: print "Pic(Q[zeta_" + str(n) + "]) is probably not a trivial group:" print G print G.gens() else: print "Pic(Q[zeta_" + str(n) + "]) is probably trivial." dif = tl[-1] - tl[-2] rtl.append(dif) # We add the runtime to the list. We have rtl[2n-1] = the runtime for Pic(Q[z_n]). print "Its computation took " + str(dif) + " seconds. \n" print "\n \n Here is the list of runtimes:" print str(rtl) print "Here is a graph" list_plot([ (2*n+2,rtl[n]) for n in range(floor(N/2))])
Pic(Q[zeta_2]) is probably trivial. Its computation took 0.00627398490906 seconds. Pic(Q[zeta_4]) is probably trivial. Its computation took 0.00443005561829 seconds. Pic(Q[zeta_6]) is probably trivial. Its computation took 0.00501394271851 seconds. Pic(Q[zeta_8]) is probably trivial. Its computation took 0.00278806686401 seconds. Pic(Q[zeta_10]) is probably trivial. Its computation took 0.00296998023987 seconds. Pic(Q[zeta_12]) is probably trivial. Its computation took 0.00259494781494 seconds. Pic(Q[zeta_14]) is probably trivial. Its computation took 0.00282216072083 seconds. Pic(Q[zeta_16]) is probably trivial. Its computation took 0.00267791748047 seconds. Pic(Q[zeta_18]) is probably trivial. Its computation took 0.00260591506958 seconds. Pic(Q[zeta_20]) is probably trivial. Its computation took 0.00267100334167 seconds. Pic(Q[zeta_22]) is probably trivial. Its computation took 0.00277018547058 seconds. Pic(Q[zeta_24]) is probably trivial. Its computation took 0.00261282920837 seconds. Pic(Q[zeta_26]) is probably trivial. Its computation took 0.00259017944336 seconds. Pic(Q[zeta_28]) is probably trivial. Its computation took 0.00276589393616 seconds. Pic(Q[zeta_30]) is probably trivial. Its computation took 0.0025839805603 seconds. Pic(Q[zeta_32]) is probably trivial. Its computation took 0.00309705734253 seconds. Pic(Q[zeta_34]) is probably trivial. Its computation took 0.00279903411865 seconds. Pic(Q[zeta_36]) is probably trivial. Its computation took 0.00312495231628 seconds. Pic(Q[zeta_38]) is probably trivial. Its computation took 0.0236110687256 seconds. Pic(Q[zeta_40]) is probably trivial. Its computation took 0.00287890434265 seconds. Pic(Q[zeta_42]) is probably trivial. Its computation took 0.00293898582458 seconds. Pic(Q[zeta_44]) is probably trivial. Its computation took 0.00316691398621 seconds. Pic(Q[zeta_46]) is probably not a trivial group: Class group of order 3 with structure C3 of Cyclotomic Field of order 46 and degree 22 (Fractional ideal class (47, zeta46 - 23),) Its computation took 0.118426084518 seconds. Pic(Q[zeta_48]) is probably trivial. Its computation took 0.0353190898895 seconds. Pic(Q[zeta_50]) is probably trivial. Its computation took 0.0659370422363 seconds. Pic(Q[zeta_52]) is probably not a trivial group: Class group of order 3 with structure C3 of Cyclotomic Field of order 52 and degree 24 (Fractional ideal class (13, zeta52 - 5),) Its computation took 0.472916841507 seconds. Pic(Q[zeta_54]) is probably trivial. Its computation took 0.0372221469879 seconds. Pic(Q[zeta_56]) is probably not a trivial group: Class group of order 2 with structure C2 of Cyclotomic Field of order 56 and degree 24 (Fractional ideal class (2, zeta56^3 + zeta56^2 + 1),) Its computation took 0.357252836227 seconds. Pic(Q[zeta_58]) is probably not a trivial group: Class group of order 8 with structure C2 x C2 x C2 of Cyclotomic Field of order 58 and degree 28 (Fractional ideal class (59, zeta58 - 24), Fractional ideal class (59, zeta58 + 5), Fractional ideal class (233, zeta58 + 46)) Its computation took 0.78329706192 seconds. Pic(Q[zeta_60]) is probably trivial. Its computation took 0.259331941605 seconds. Here is the list of runtimes: [0.006273984909057617, 0.004430055618286133, 0.005013942718505859, 0.002788066864013672, 0.002969980239868164, 0.0025949478149414062, 0.0028221607208251953, 0.00267791748046875, 0.002605915069580078, 0.0026710033416748047, 0.0027701854705810547, 0.0026128292083740234, 0.002590179443359375, 0.0027658939361572266, 0.0025839805603027344, 0.003097057342529297, 0.0027990341186523438, 0.0031249523162841797, 0.023611068725585938, 0.002878904342651367, 0.002938985824584961, 0.0031669139862060547, 0.11842608451843262, 0.03531908988952637, 0.06593704223632812, 0.472916841506958, 0.03722214698791504, 0.357252836227417, 0.783297061920166, 0.25933194160461426] Here is a graph
Image in a Jupyter notebook
# =================================== Problem 2.3 =========================== N = 46 # For more flexibility we make sure we can change this 60. nl = [n for n in range(2, N) if n%2==0] # nl stands for "number list" rtl = [] # rtl stands for "run time list." import time startTime = time.time() tl = [startTime] # tl stands for "time list". for n in nl: K=CyclotomicField(n) G=K.class_group() theTime = time.time() tl.append(theTime) if G.order()>1: print "Pic(Q[zeta_" + str(n) + "]) is certainly not a trivial group:" print G print G.gens() else: print "Pic(Q[zeta_" + str(n) + "]) is certainly trivial." dif = tl[-1] - tl[-2] rtl.append(dif) # We add the runtime to the list. We have rtl[2n-1] = the runtime for Pic(Q[z_n]). print "Its computation took " + str(dif) + " seconds. \n" print "\n \n Here is the list of runtimes:" print str(rtl) print "Here is a graph" list_plot([ (2*n+2,rtl[n]) for n in range(floor(N/2)-1)])
Pic(Q[zeta_2]) is certainly trivial. Its computation took 0.00854110717773 seconds. Pic(Q[zeta_4]) is certainly trivial. Its computation took 0.00630497932434 seconds. Pic(Q[zeta_6]) is certainly trivial. Its computation took 0.0074520111084 seconds. Pic(Q[zeta_8]) is certainly trivial. Its computation took 0.00537300109863 seconds. Pic(Q[zeta_10]) is certainly trivial. Its computation took 0.00648903846741 seconds. Pic(Q[zeta_12]) is certainly trivial. Its computation took 0.00772404670715 seconds. Pic(Q[zeta_14]) is certainly trivial. Its computation took 0.0112869739532 seconds. Pic(Q[zeta_16]) is certainly trivial. Its computation took 0.0417578220367 seconds. Pic(Q[zeta_18]) is certainly trivial. Its computation took 0.0106990337372 seconds. Pic(Q[zeta_20]) is certainly trivial. Its computation took 0.0259780883789 seconds. Pic(Q[zeta_22]) is certainly trivial. Its computation took 0.0798649787903 seconds. Pic(Q[zeta_24]) is certainly trivial. Its computation took 0.0315229892731 seconds. Pic(Q[zeta_26]) is certainly trivial. Its computation took 0.148895025253 seconds. Pic(Q[zeta_28]) is certainly trivial. Its computation took 0.148437023163 seconds. Pic(Q[zeta_30]) is certainly trivial. Its computation took 0.0278499126434 seconds. Pic(Q[zeta_32]) is certainly trivial. Its computation took 0.496668100357 seconds. Pic(Q[zeta_34]) is certainly trivial. Its computation took 0.471917867661 seconds. Pic(Q[zeta_36]) is certainly trivial. Its computation took 0.145421028137 seconds. Pic(Q[zeta_38]) is certainly trivial. Its computation took 0.873857975006 seconds. Pic(Q[zeta_40]) is certainly trivial. Its computation took 0.693585157394 seconds. Pic(Q[zeta_42]) is certainly trivial. Its computation took 0.240392923355 seconds. Pic(Q[zeta_44]) is certainly trivial. Its computation took 2.68780303001 seconds. Here is the list of runtimes: [0.008541107177734375, 0.00630497932434082, 0.0074520111083984375, 0.0053730010986328125, 0.0064890384674072266, 0.00772404670715332, 0.01128697395324707, 0.041757822036743164, 0.010699033737182617, 0.02597808837890625, 0.0798649787902832, 0.03152298927307129, 0.1488950252532959, 0.1484370231628418, 0.027849912643432617, 0.49666810035705566, 0.47191786766052246, 0.14542102813720703, 0.8738579750061035, 0.6935851573944092, 0.24039292335510254, 2.687803030014038] Here is a graph
Image in a Jupyter notebook
# =================================== Problem 3.1 =========================== N = 30 # The lenght of prime lists we will give. R.<x>=PolynomialRing(Rationals()) K.<a>=NumberField(x^3+x+1) count=0; p=0; split_primes= range(N) while count<N: p = next_prime(p) facorisation=K.ideal(p).factor() if len(facorisation)==3: split_primes[count]=p count=count+1 print str(split_primes)
[47, 67, 131, 149, 173, 227, 283, 293, 349, 379, 431, 521, 577, 607, 617, 653, 811, 839, 853, 857, 919, 937, 971, 1031, 1063, 1117, 1187, 1213, 1237, 1259]
# =================================== Problem 3.2 =========================== N = 30 count=0; p=0; special_primes=range(0,N) while count<N: p = next_prime(p) # this replaces "p=prime_range(p+1, p+100)[0]" for i in range(0,floor(sqrt(p))): if sqrt((p-i^2)/31) in ZZ: special_primes[count]=(p, i, sqrt((p-i^2)/31)) #each triple represents (p,x,y) count=count+1 print "Here is the list of triples (p,x,y) with x^2 + 31 y^2 = p." print str(special_primes) + "\n" primeList = [] for triple in special_primes: primeList.append(triple[0]) print "Here are the 30 smallest primes." print primeList
Here is the list of triples (p,x,y) with x^2 + 31 y^2 = p. [(31, 0, 1), (47, 4, 1), (67, 6, 1), (131, 10, 1), (149, 5, 2), (173, 7, 2), (227, 14, 1), (283, 2, 3), (293, 13, 2), (349, 15, 2), (379, 10, 3), (521, 5, 4), (577, 9, 4), (617, 11, 4), (653, 23, 2), (811, 6, 5), (839, 8, 5), (853, 27, 2), (857, 19, 4), (919, 12, 5), (937, 21, 4), (971, 14, 5), (1031, 16, 5), (1063, 28, 3), (1117, 1, 6), (1213, 33, 2), (1237, 11, 6), (1259, 22, 5), (1303, 32, 3), (1451, 26, 5)] Here are the 30 smallest primes. [31, 47, 67, 131, 149, 173, 227, 283, 293, 349, 379, 521, 577, 617, 653, 811, 839, 853, 857, 919, 937, 971, 1031, 1063, 1117, 1213, 1237, 1259, 1303, 1451]
# =================================== Example 1. Problem 3.3 =========================== R.<x>=PolynomialRing(Rationals()) f=x^2+15*x+467 N = 30 K.<a>=NumberField(f) d=K.degree() print "The discriminant of f is " + str(K.discriminant()) if K.discriminant()<0: minDisc = -K.discriminant() count=0; p=minDisc; special_primes=range(0,N) while count<N: p = next_prime(p) for i in range(0,floor(sqrt(p))): if sqrt((p-i^2)/minDisc) in ZZ: special_primes[count]=(p, i, sqrt((p-i^2)/minDisc)) #each triple represents (p,x,y) count=count+1 print "Here is the list of triples (p,x,y) with x^2 - disc(f)y^2 = p." print str(special_primes) + "\n" primeList = [] for triple in special_primes: primeList.append(triple[0]) print "Here are the 30 smallest primes of the form x^2 - disc(f)y^2." print primeList conjecture = range(0,N) for i in range(0,N): if len(K.ideal(primeList[i]).factor())==d: conjecture[i]=True else: conjecture[i]=False print str(primeList[i]) + "=" + str(K.ideal(primeList[i]).factor()) print conjecture else: print "We cannot deal with number fields with positive discriminants now."
The discriminant of f is -1643 Here is the list of triples (p,x,y) with x^2 - disc(f)y^2 = p. [(1787, 12, 1), (2543, 30, 1), (2939, 36, 1), (3407, 42, 1), (3947, 48, 1), (6581, 3, 2), (6653, 9, 2), (6827, 72, 1), (7013, 21, 2), (7727, 78, 1), (8093, 39, 2), (8597, 45, 2), (8699, 84, 1), (9173, 51, 2), (9743, 90, 1), (10859, 96, 1), (12197, 75, 2), (14639, 114, 1), (14851, 8, 3), (14887, 10, 3), (14983, 14, 3), (15187, 20, 3), (15271, 22, 3), (16231, 38, 3), (16903, 46, 3), (17491, 52, 3), (17519, 126, 1), (17597, 105, 2), (17923, 56, 3), (19687, 70, 3)] Here are the 30 smallest primes of the form x^2 - disc(f)y^2. [1787, 2543, 2939, 3407, 3947, 6581, 6653, 6827, 7013, 7727, 8093, 8597, 8699, 9173, 9743, 10859, 12197, 14639, 14851, 14887, 14983, 15187, 15271, 16231, 16903, 17491, 17519, 17597, 17923, 19687] [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
# =================================== Example 2. Problem 3.3 =========================== R.<x>=PolynomialRing(Rationals()) f=x^3-x^2+3*x+1 N = 30 K.<a>=NumberField(f) d=K.degree() print "The discriminant of f is " + str(K.discriminant()) if K.discriminant()<0: minDisc = -K.discriminant() count=0; p=minDisc; special_primes=range(0,N) while count<N: p = next_prime(p) for i in range(0,floor(sqrt(p))): if sqrt((p-i^2)/minDisc) in ZZ: special_primes[count]=(p, i, sqrt((p-i^2)/minDisc)) #each triple represents (p,x,y) count=count+1 print "Here is the list of triples (p,x,y) with x^2 - disc(f)y^2 = p." print str(special_primes) + "\n" primeList = [] for triple in special_primes: primeList.append(triple[0]) print "Here are the 30 smallest primes of the form x^2 - disc(f)y^2." print primeList conjecture = range(0,N) for i in range(0,N): if len(K.ideal(primeList[i]).factor())==d: conjecture[i]=True else: conjecture[i]=False print str(primeList[i]) + "=" + str(K.ideal(primeList[i]).factor()) print conjecture else: print "We cannot deal with number fields with positive discriminants now."
The discriminant of f is -44 Here is the list of triples (p,x,y) with x^2 - disc(f)y^2 = p. [(53, 3, 1), (257, 9, 2), (269, 15, 1), (397, 1, 3), (401, 15, 2), (421, 5, 3), (617, 21, 2), (757, 19, 3), (929, 15, 4), (1021, 25, 3), (1109, 3, 5), (1181, 9, 5), (1237, 29, 3), (1433, 27, 4), (1609, 5, 6), (1621, 35, 3), (1697, 39, 2), (1753, 13, 6), (1873, 17, 6), (2113, 23, 6), (2237, 9, 7), (2381, 15, 7), (2621, 39, 5), (2729, 45, 4), (2777, 51, 2), (2797, 49, 3), (2897, 9, 8), (2953, 37, 6), (3041, 15, 8), (3257, 21, 8)] Here are the 30 smallest primes of the form x^2 - disc(f)y^2. [53, 257, 269, 397, 401, 421, 617, 757, 929, 1021, 1109, 1181, 1237, 1433, 1609, 1621, 1697, 1753, 1873, 2113, 2237, 2381, 2621, 2729, 2777, 2797, 2897, 2953, 3041, 3257] [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
# =================================== Example 3. Problem 3.3 =========================== R.<x>=PolynomialRing(Rationals()) f=x^5-x^4-3*x+1 N = 5 K.<a>=NumberField(f) d=K.degree() print "The discriminant of f is " + str(K.discriminant()) if K.discriminant()<0: minDisc = -K.discriminant() count=0; p=minDisc; special_primes=range(0,N) while count<N: p = next_prime(p) for i in range(0,floor(sqrt(p))): if sqrt((p-i^2)/minDisc) in ZZ: special_primes[count]=(p, i, sqrt((p-i^2)/minDisc)) #each triple represents (p,x,y) count=count+1 print "Here is the list of triples (p,x,y) with x^2 - disc(f)y^2 = p." print str(special_primes) + "\n" primeList = [] for triple in special_primes: primeList.append(triple[0]) print "Here are the 30 smallest primes of the form x^2 - disc(f)y^2." print primeList conjecture = range(0,N) for i in range(0,N): if len(K.ideal(primeList[i]).factor())==d: conjecture[i]=True else: conjecture[i]=False print str(primeList[i]) + "=" + str(K.ideal(primeList[i]).factor()) print conjecture else: print "We cannot deal with number fields with positive discriminants now."
The discriminant of f is -70448 Here is the list of triples (p,x,y) with x^2 - disc(f)y^2 = p. [(70457, 3, 1), (70529, 9, 1), (71537, 33, 1), (75209, 69, 1), (78017, 87, 1)] Here are the 30 smallest primes of the form x^2 - disc(f)y^2. [70457, 70529, 71537, 75209, 78017] 70457=(Fractional ideal (-554*a^4 + 323*a^3 + 76*a^2 - 390*a + 832)) * (Fractional ideal (2*a^3 + 5*a - 8)) * (Fractional ideal (-a^4 + 2*a^3 + 4*a^2 - 7*a + 7)) 70529=(Fractional ideal (-315*a^4 - 162*a^3 + 610*a^2 - 106*a + 1044)) * (Fractional ideal (5*a^4 + 2*a^3 - 2*a^2 + 5*a - 13)) * (Fractional ideal (-8*a^4 + 3*a^3 + 4*a^2 - 5*a + 23)) 71537=Fractional ideal (71537) 75209=(Fractional ideal (567*a^4 - 272*a^3 - 343*a^2 + 368*a - 1179)) * (Fractional ideal (-9*a^4 + 3*a^3 + 4*a^2 - 4*a + 25)) * (Fractional ideal (4*a^4 - 8*a^3 + 3*a^2 + 4*a - 10)) 78017=Fractional ideal (78017) [False, False, False, False, False]
# =================================== Problem 4.1 =========================== R.<x>=PolynomialRing(Rationals()) K.<a>=NumberField(x^5-5*x^2-25*x+1) K.unit_group() OK = K.maximal_order() print "Here is a basis for the ring of integers:" OK.basis() print "So the ring of integers is equal to Q[a, 1/2(1+a+a^2+a^3+a^4)]."
Here is a basis for the ring of integers: So the ring of integers is equal to Q[a, 1/2(1+a+a^2+a^3+a^4)].
fundamental_units=[0,0,0] for j in [0,1,2]: fundamental_units[j]=K.unit_group().gens()[j+1].value() print fundamental_units
[a, a + 2, 15/2*a^4 - 1/2*a^3 - 77/2*a^2 - 15*a + 3/2]
# =================================== Problem 4.2 =========================== print K.class_group() print K.class_group().gens()
Class group of order 5 with structure C5 of Number Field in a with defining polynomial x^5 - 5*x^2 - 25*x + 1 (Fractional ideal class (2, a + 1),)
# =================================== Problem 4.3 =========================== I2=K.class_group().gens()[0] norm=I2.ideal().norm() power=0 for i in range(1,5): if norm^i<=11: power=i Ideals=range(0,power) for i in range(0,power): Ideals[i]=I2^(i+1) print Ideals
[Fractional ideal class (2, a + 1)]
# =================================== Problem 4.4 =========================== u=-4574929890500*a^4+5400980402504*a^3-7568189710845*a^2+55244137453268*a-2180771968584 U=K.unit_group()(u) print K.unit_group().gens() print (K.unit_group().gens()[0].value(), K.unit_group().gens()[1].value(), K.unit_group().gens()[2].value(), K.unit_group().gens()[3].value()) print U
(u0, u1, u2, u3) (-1, a, a + 2, 15/2*a^4 - 1/2*a^3 - 77/2*a^2 - 15*a + 3/2) u0*u1^8*u2^-10*u3^6
# =================================== Problem 4.5 =========================== L.<b>=NumberField(x^5-10*x^2-4*x+160) r=rank(L.unit_group()) zeta=range(0,r) Zeta=zeta # We want Zeta to consists of fundamental units of A=ZZ[b] for i in range(0,r): zeta[i]=L.unit_group(proof=True).fundamental_units()[i] # zeta becomes an array consists of fundamental units of the ring of integers of L. A=ZZ[b];O=L.maximal_order() t=0 test_Zeta=range(0,len(Zeta)) # This array is used to check if all the entris in Zeta are already in A. zeros_Zeta=range(0,len(Zeta)) for i in range(0,len(Zeta)): zeros_Zeta[i]=0 # If every entry of test_Zeta equals to 0, then we get Zeta to be the array what we want. while test_Zeta!=zeros_Zeta: t=t+1 for i in range(0,len(Zeta)): Zeta[i]=L(Zeta[i]*zeta[i]) # The fundamental units in A are powers of fundamental units in the ring of integers of L. for i in range(0,len(Zeta)): if Zeta[i] in A: test_Zeta[i]=0 else: test_Zeta[i]=1 print 'The system of fundamental units of A is given by Zeta=' +str(Zeta) print 'The system of fundamental units of A are of the power ' + str(t) + ' of the system of fundamental units of the ring of integers of L.'
The system of fundamental units of A is given by Zeta=[878214459313121881063913655697681790490621169705087957503933795*b^4 - 2230393255863722542345282181742587773603764284509044527332793244*b^3 + 5664509417999339779435978422536183188777463604771479920322777934*b^2 - 23168247520158595280274888897667450693606707974163212864983674372*b + 55327329170781042307537055051947886262276850974725698448693181361, 114202837635797847055568456255444049609289725824507919502122023406221970122239342356768839726343613624553189*b^4 - 290039905585937738542093605436230793492912044905292093461384962166950477941346922510895587488461633332013084*b^3 + 736611703997892292910895929195022516152487505987941289764742806156774131771230664912133278176772767703514302*b^2 - 3012794405503264792864791969188726819427195044874091813887674899407151252866794624465368922515000910800022612*b + 7194755134247014311598238930229001268815038184723855811664262722815049098639949249023598405763654814636584001] The system of fundamental units of A are of the power 2 of the system of fundamental units of the ring of integers of L.