Description
When working with ZZ/d-graded factorizations of period > 2, the operations are often dependent on the existence of a distinguished primitive root of unity. The adjoinRoot command allows the user to adjoin or specify a distinguished root of unity to either a ring or a ZZdFactorization/ZZdFactorizationMap.
We will illustrate all of the methods of adjoining a distinguished root of unity, including the advantages/disadvantages of using certain methods.
i1 : Q = QQ[x_1..x_3];
|
i2 : d = 3;
|
i3 : Qt = adjoinRoot(d, Q, t)
o3 = Qt
o3 : QuotientRing
|
i4 : Qt.rootOfUnity --stores the root of unity in the ring
o4 = t
o4 : Qt
|
i5 : {t, t^2, t^3}
o5 = {t, - t - 1, 1}
o5 : List
|
Any factorization of length > 2 constructed over the ring $Qt$ will automatically cache the distinguished root of unity $t$.
i6 : Dt = ZZdfactorization {x_1*1_Qt,x_2*1_Qt,x_3*1_Qt}
1 1 1 1
o6 = Qt <-- Qt <-- Qt <-- Qt
0 1 2 0
o6 : ZZdFactorization
|
i7 : Dt.cache.rootOfUnity
o7 = t
o7 : Qt
|
If the user forgets to adjoin a root of unity, then one can directly adjoin a root to the factorization by either using adjoinRoot or tensoring with a ring that contains a root of unity.
i8 : S = QQ[x,y,z];
|
i9 : C = ZZdfactorization {x,y,z}
1 1 1 1
o9 = S <-- S <-- S <-- S
0 1 2 0
o9 : ZZdFactorization
|
i10 : C.cache.?rootOfUnity
o10 = false
|
i11 : Ct = adjoinRoot(C, t)
/ S[t] \1 / S[t] \1 / S[t] \1 / S[t] \1
o11 = |----------| <-- |----------| <-- |----------| <-- |----------|
| 2 | | 2 | | 2 | | 2 |
\t + t + 1/ \t + t + 1/ \t + t + 1/ \t + t + 1/
0 1 2 0
o11 : ZZdFactorization
|
i12 : (Ct.cache.?rootOfUnity, Ct.cache.rootOfUnity)
o12 = (true, t)
o12 : Sequence
|
i13 : St = adjoinRoot(3, S, t);
|
i14 : Ct' = C**St
1 1 1 1
o14 = St <-- St <-- St <-- St
0 1 2 0
o14 : ZZdFactorization
|
i15 : Ct'.cache.rootOfUnity
o15 = t
o15 : St
|
Sometimes a ring already has a distinguished root of unity without the need to adjoin a new variable. The user can specify such a distinguished root of unity in this case, and all constructions for factorizations of larger period will go through using this distinguished root of unifty.
i16 : R = ZZ/3[x,y,z]
o16 = R
o16 : PolynomialRing
|
i17 : R.rootOfUnity = 1_R
o17 = 1
o17 : R
|
i18 : Cx = ZZdfactorization {x,x,x}
1 1 1 1
o18 = R <-- R <-- R <-- R
0 1 2 0
o18 : ZZdFactorization
|
i19 : Cy = ZZdfactorization {y,y,y}
1 1 1 1
o19 = R <-- R <-- R <-- R
0 1 2 0
o19 : ZZdFactorization
|
i20 : Cz = ZZdfactorization {z,z,z}
1 1 1 1
o20 = R <-- R <-- R <-- R
0 1 2 0
o20 : ZZdFactorization
|
i21 : Cxyz = Cx**Cy**Cz
9 9 9 9
o21 = R <-- R <-- R <-- R
0 1 2 0
o21 : ZZdFactorization
|
i22 : Cxyz.dd
9 9
o22 = 2 : R <------------------------- R : 0
| z 0 0 y x 0 0 0 0 |
| 0 z 0 0 y x 0 0 0 |
| 0 0 z x 0 y 0 0 0 |
| 0 0 0 z 0 0 y x 0 |
| 0 0 0 0 z 0 0 y x |
| 0 0 0 0 0 z x 0 y |
| y x 0 0 0 0 z 0 0 |
| 0 y x 0 0 0 0 z 0 |
| x 0 y 0 0 0 0 0 z |
9 9
0 : R <------------------------- R : 1
| z 0 0 y x 0 0 0 0 |
| 0 z 0 0 y x 0 0 0 |
| 0 0 z x 0 y 0 0 0 |
| 0 0 0 z 0 0 y x 0 |
| 0 0 0 0 z 0 0 y x |
| 0 0 0 0 0 z x 0 y |
| y x 0 0 0 0 z 0 0 |
| 0 y x 0 0 0 0 z 0 |
| x 0 y 0 0 0 0 0 z |
9 9
1 : R <------------------------- R : 2
| z 0 0 y x 0 0 0 0 |
| 0 z 0 0 y x 0 0 0 |
| 0 0 z x 0 y 0 0 0 |
| 0 0 0 z 0 0 y x 0 |
| 0 0 0 0 z 0 0 y x |
| 0 0 0 0 0 z x 0 y |
| y x 0 0 0 0 z 0 0 |
| 0 y x 0 0 0 0 z 0 |
| x 0 y 0 0 0 0 0 z |
o22 : ZZdFactorizationMap
|
i23 : Cxyz.dd^3
9 9
o23 = 0 : R <---------------------------------------------------------------------------------------- R : 0
| x3+y3+z3 0 0 0 0 0 0 0 0 |
| 0 x3+y3+z3 0 0 0 0 0 0 0 |
| 0 0 x3+y3+z3 0 0 0 0 0 0 |
| 0 0 0 x3+y3+z3 0 0 0 0 0 |
| 0 0 0 0 x3+y3+z3 0 0 0 0 |
| 0 0 0 0 0 x3+y3+z3 0 0 0 |
| 0 0 0 0 0 0 x3+y3+z3 0 0 |
| 0 0 0 0 0 0 0 x3+y3+z3 0 |
| 0 0 0 0 0 0 0 0 x3+y3+z3 |
9 9
1 : R <---------------------------------------------------------------------------------------- R : 1
| x3+y3+z3 0 0 0 0 0 0 0 0 |
| 0 x3+y3+z3 0 0 0 0 0 0 0 |
| 0 0 x3+y3+z3 0 0 0 0 0 0 |
| 0 0 0 x3+y3+z3 0 0 0 0 0 |
| 0 0 0 0 x3+y3+z3 0 0 0 0 |
| 0 0 0 0 0 x3+y3+z3 0 0 0 |
| 0 0 0 0 0 0 x3+y3+z3 0 0 |
| 0 0 0 0 0 0 0 x3+y3+z3 0 |
| 0 0 0 0 0 0 0 0 x3+y3+z3 |
9 9
2 : R <---------------------------------------------------------------------------------------- R : 2
| x3+y3+z3 0 0 0 0 0 0 0 0 |
| 0 x3+y3+z3 0 0 0 0 0 0 0 |
| 0 0 x3+y3+z3 0 0 0 0 0 0 |
| 0 0 0 x3+y3+z3 0 0 0 0 0 |
| 0 0 0 0 x3+y3+z3 0 0 0 0 |
| 0 0 0 0 0 x3+y3+z3 0 0 0 |
| 0 0 0 0 0 0 x3+y3+z3 0 0 |
| 0 0 0 0 0 0 0 x3+y3+z3 0 |
| 0 0 0 0 0 0 0 0 x3+y3+z3 |
o23 : ZZdFactorizationMap
|
The user can also adjoin roots of unity directly to maps of factorizations, if needed.
i24 : use S;
|
i25 : C = ZZdfactorization {x,y,z}
1 1 1 1
o25 = S <-- S <-- S <-- S
0 1 2 0
o25 : ZZdFactorization
|
i26 : newId = adjoinRoot(id_C, t)
/ S[t] \1 / S[t] \1
o26 = 0 : |----------| <--------- |----------| : 0
| 2 | | 1 | | 2 |
\t + t + 1/ \t + t + 1/
/ S[t] \1 / S[t] \1
1 : |----------| <--------- |----------| : 1
| 2 | | 1 | | 2 |
\t + t + 1/ \t + t + 1/
/ S[t] \1 / S[t] \1
2 : |----------| <--------- |----------| : 2
| 2 | | 1 | | 2 |
\t + t + 1/ \t + t + 1/
o26 : ZZdFactorizationMap
|
i27 : tnewId = newId**newId
/ S[t] \3 / S[t] \3
o27 = 0 : |----------| <------------- |----------| : 0
| 2 | | 1 0 0 | | 2 |
\t + t + 1/ | 0 1 0 | \t + t + 1/
| 0 0 1 |
/ S[t] \3 / S[t] \3
1 : |----------| <------------- |----------| : 1
| 2 | | 1 0 0 | | 2 |
\t + t + 1/ | 0 1 0 | \t + t + 1/
| 0 0 1 |
/ S[t] \3 / S[t] \3
2 : |----------| <------------- |----------| : 2
| 2 | | 1 0 0 | | 2 |
\t + t + 1/ | 0 1 0 | \t + t + 1/
| 0 0 1 |
o27 : ZZdFactorizationMap
|
i28 : assert(source tnewId == (C**ring newId)**(C**ring newId))
|