🐱

【AbstractAlgebra.jl】Juliaで代数学をやってみたいんじゃ③ ~-1の平方根をたくさんつくろう~

2022/12/31に公開

Introduction

本記事では、JuliaのパッケージAbstractAlgebra.jlを使いながら-1の平方根をたくさんつくっていきます。

今回、参考にしたのは以下の記事です。
https://mathlog.info/articles/3794

とても面白い内容なので、ぜひ読んでみてください。上記記事の概要を少しだけ説明します。

\mathbb{R}[X]/(X^2+1) \cong \mathbb{C}

であることは、よく知られていますが

\mathbb{C}[X]/(X^2+1)

とした場合に、何が起こるかについて調べています。

\mathbb{C}[X]/(X^2+1)には-1の平方根(正確には、-1+(X^2+1)の平方根)が4つ存在し、それらは

\pm i + (X^2+1),\ \pm X + (X^2+1)

であることが示されています。

また

\mathbb{C}[X]/(X^2+1) \cong \mathbb{C}^2

となっていて、\pm i + (X^2+1)(\pm i, \pm i)に対応させることができ、\pm X + (X^2+1)(\mp i, \pm i)に対応させることができます(複合同順)。

この内容をヒントにしながら、-1の平方根をたくさんつくって遊んでみましょう!

前提知識・記号

Rを可換環とする。

R[X]=\{a_0+a_1X+a_2X^2+\cdots+a_nX^n\ |\ n\in \mathbb{Z}_{\geqq 0},\ a_0,a_1,\cdots,a_n \in R\}

とし、f(X) \in R[X]に対し

(f(X))_{R[X]}=\{f(X)g(X)\ |\ g(X)\in R[X]\}

とする。

また、h(X) \in R[X]に対し

h(X)+(f(X))_{R[X]}=\{h(X)+f(X)g(X)\ |\ g(X)\in R[X]\}

とし

R[X]/(f(X))_{R[X]}=\{g(X)+(f(X))_{R[X]}\ |\ g(X)\in R[X]\}

とおく。

このとき、R[X]/(f(X))_{R[X]}は以下の演算+,\cdotについて可換環をなす。

g(X),\ h(X) \in R[X]に対し

\begin{aligned} \{g(X)+(f(X))_{R[X]}\}+\{h(X)+(f(X))_{R[X]}\}&=(g(X)+h(X))+(f(X))_{R[X]}\\ \{g(X)+(f(X))_{R[X]}\}\cdot\{h(X)+(f(X))_{R[X]}\}&= g(X)h(X)+(f(X))_{R[X]} \end{aligned}

特に、Rにおける乗法単位元を1_{R}とすると、R[X]/(f(X))_{R[X]}における乗法単位元は1_R+(f(X))_{R[X]}であり、その加法逆元は-1_R+(f(X))_{R[X]}である。…(*1)

※詳しい証明は省略しますが、R[X]が可換環であること、(f(X))_{R[X]} \subset R[X]がイデアルであることから、示すことができます。

※今回扱う代数学のトピックについては、以下のサイトが参考になると思います。

https://manabitimes.jp/math/1744

https://mathlandscape.com/quotient-ring/

https://manabitimes.jp/math/2510

方針

以下の方針で-1の平方根をつくっていきます。(私が発見できていないだけかもしれませんが)、AbstractAlgebra.jlでは、\mathbb{R}\mathbb{C}が用意されていないようなので、代わりに\mathbb{Q}[X]からスタートしていこうと思います。

また、本記事では、可換環Rの乗法単位元を1_R、その加法逆元を-1_Rと書くとします。ただし、1_{\mathbb{Q}}=1,\ -1_{\mathbb{Q}}=-1とします。

お気持ちと概要

簡単にお気持ちと概要を書いておきます。

まず

T_1 = \mathbb{Q}[X]/(X^2+1)_{\mathbb{Q}[X]}

とすると、-1_{T_1}の平方根が2つ(\pm X+(X^2+1)_{\mathbb{Q}[X]})できます。

次に、このT_1を元にして

T_2 = T_1[Y]/(Y^2+1_{T_1})_{T_1[Y]}

とします。

T_1にはすでに-1_{T_1}の平方根が2つあるので、それに加えて、少なくとも2-1_{T_2}の平方根(\pm Y+(Y^2+1_{T_1})_{T_1[Y]})をつくることができ、-1_{T_2}の平方根が4つできます。

さらに、このT_2を元にして

T_3 = T_2[Z]/(Z^2+1_{T_2})_{T_2[Z]}

とします。

T_2にはすでに-1_{T_2}の平方根が4つあるので、それに加えて、少なくとも2-1_{T_3}の平方根(\pm Z+(Z^2+1_{T_2})_{T_2[Z]})をつくることができ、-1_{T_3}の平方根が6つできます。

※本記事では、T_2,T_3がどんな構造や性質を持っているかについては調べません。-1_{T_2},-1_{T_3}の平方根がこれら以外に存在しているのかは確認せず進めていきます。

Step1

T_1 = \mathbb{Q}[X]/(X^2+1)_{\mathbb{Q}[X]}

とする。

(*1)より

\begin{aligned} 1_{T_1} &= 1+(X^2+1)_{\mathbb{Q}[X]}\\ -1_{T_1} &= -1+(X^2+1)_{\mathbb{Q}[X]}\\ \end{aligned}

である。

ここで、\pm X + (X^2+1)_{\mathbb{Q}[X]}2乗を計算してみよう。

\begin{aligned} (\pm X + (X^2+1)_{\mathbb{Q}[X]})^2 &= X^2+ (X^2+1)_{\mathbb{Q}[X]}\\ &= -1 + X^2+1 + (X^2+1)_{\mathbb{Q}[X]}\\ &= -1 + (X^2+1)_{\mathbb{Q}[X]}\\ &= -1_{T_1} \end{aligned}

となる。

したがって、\pm X + (X^2+1)_{\mathbb{Q}[X]}-1_{T_1}の平方根となっていることがわかる。

Step2

T_1は可換環なので、以下のように定めたT_2も可換環となる。

T_2 = T_1[Y]/(Y^2+1_{T_1})_{T_1[Y]}

このとき、(*1)より

\begin{aligned} 1_{T_2}&=1_{T_1}+(Y^2+1_{T_1})_{T_1[Y]}\\ -1_{T_2} &= -1_{T_1}+(Y^2+1_{T_1})_{T_1[Y]} \end{aligned}

となる。

ここで

c = X+(X^2+1)_{\mathbb{Q}[X]},\ d = -X+(X^2+1)_{\mathbb{Q}[X]}

とすると、c,d \in T_1 \subset T_1[Y]である(T_1[Y]における定数項となっている)。

Step1より

c^2 = d^2 = -1_{T_1}

である。

c_r = c+(Y^2+1_{T_1})_{T_1[Y]},\ d_r = d+(Y^2+1_{T_1})_{T_1[Y]}

とすると、c_r,d_r \in T_2であり

\begin{aligned} c_r^2 &= (c+(Y^2+1_{T_1})_{T_1[Y]})^2\\ &= c^2+(Y^2+1_{T_1})_{T_1[Y]}\\ &= -1_{T_1}+(Y^2+1_{T_1})_{T_1[Y]}\\ &= -1_{T_2} \end{aligned}
\begin{aligned} d_r^2 &= (d+(Y^2+1_{T_1})_{T_1[Y]})^2\\ &= d^2+(Y^2+1_{T_1})_{T_1[Y]}\\ &= -1_{T_1}+(Y^2+1_{T_1})_{T_1[Y]}\\ &= -1_{T_2} \end{aligned}

となる。

次に

e = Y,\ f = -Y

とすると、e,f \in T_1[Y]である。

\begin{aligned} e_r &= e+(Y^2+1_{T_1})_{T_1[Y]} \\ &= Y+(Y^2+1_{T_1})_{T_1[Y]} \end{aligned}
\begin{aligned} f_r &= f+(Y^2+1_{T_1})_{T_1[Y]}\\ &= -Y+(Y^2+1_{T_1})_{T_1[Y]}\\ \end{aligned}

とすると、e_r,f_r \in T_2である。

\begin{aligned} e_r^2 &= (e+(Y^2+1_{T_1})_{T_1[Y]})^2\\ &= e^2+(Y^2+1_{T_1})_{T_1[Y]}\\ &= Y^2+(Y^2+1_{T_1})_{T_1[Y]}\\ &= -1_{T_1}+Y^2+1_{T_1}+(Y^2+1_{T_1})_{T_1[Y]}\\ &= -1_{T_1}+(Y^2+1_{T_1})_{T_1[Y]}\\ &= -1_{T_2} \end{aligned}
\begin{aligned} f_r^2 &= (f+(Y^2+1_{T_1})_{T_1[Y]})^2\\ &= f^2+(Y^2+1_{T_1})_{T_1[Y]}\\ &= Y^2+(Y^2+1_{T_1})_{T_1[Y]}\\ &= -1_{T_1}+Y^2+1_{T_1}+(Y^2+1_{T_1})_{T_1[Y]}\\ &= -1_{T_1}+(Y^2+1_{T_1})_{T_1[Y]}\\ &= -1_{T_2} \end{aligned}

である。

したがって、c_r,d_r,e_r,f_r-1_{T_2}の平方根となっていることがわかる。

Step3

T_2は可換環なので、以下のように定めたT_3も可換環となる。

T_3 = T_2[Z]/(Z^2+1_{T_2})_{T_2[Z]}

Step2と同様にして、以下のg_r,h_r,i_r,j_r,k_r,l_r-1_{T_3}の平方根となることが確かめられる。

\begin{aligned} &g_r = c_r+(Z^2+1_{T_2})_{T_2[Z]}\\ &h_r = d_r+(Z^2+1_{T_2})_{T_2[Z]}\\ &i_r = e_r+(Z^2+1_{T_2})_{T_2[Z]}\\ &j_r = f_r+(Z^2+1_{T_2})_{T_2[Z]}\\ &k_r = Z+(Z^2+1_{T_2})_{T_2[Z]}\\ &l_r = -Z+(Z^2+1_{T_2})_{T_2[Z]} \end{aligned}

AbstractAlgebra.jlで-1の平方根をたくさんつくろう

では、AbstractAlgebra.jlを使って、-1の平方根をたくさんつくってみましょう。

Step1

S_1 = \mathbb{Q}[X],\ T_1 = \mathbb{Q}[X]/(X^2+1)_{\mathbb{Q}[X]},

\begin{aligned} a&=X\\ b&=-X \end{aligned}

とし

\begin{aligned} a_{r}&=a+(X^2+1)_{\mathbb{Q}[X]}\\ b_r&=b+(X^2+1)_{\mathbb{Q}[X]} \end{aligned}

となるようにコードを書き、a_{r}^2,\ b_{r}^2を出力してみます。

using AbstractAlgebra

### Q[x]/(x^2+1)における-1の平方根

# S1をQ[x]とする
S1, x = PolynomialRing(QQ, "x")

# T1をQ[x]/(x^2+1)とする
T1 = ResidueRing(S1, x^2+1)

# S1,T1を出力
println("S1:",S1)
println("T1:",T1)

# S1の元aをxとする
a = S1([0, 1])

# S1の元bを-xとする
b = S1([0, -1])

# a,bを出力
println("a=",a)
println("b=",b)

# T1におけるaをarとする
ar = T1(a)

# T1におけるbをbrとする
br = T1(b)

# ar^2,br^2を出力
println("ar^2=",ar^2)
println("br^2=",br^2)

出力結果は以下です。

S1:Univariate Polynomial Ring in x over Rationals
T1:Residue ring of Univariate Polynomial Ring in x over Rationals modulo x^2 + 1
a=x
b=-x
ar^2=-1
br^2=-1

2乗して-1になっていることが確認できました。

Step2

S_2 = T_1[Y],\ T_2 = T_1[Y]/(Y^2+1_{T_1})_{T_1[Y]},

\begin{aligned} c&=a_r\\ d&=b_r\\ e&=Y\\ f&=-Y \end{aligned}

とし

\begin{aligned} &c_r &= c+(Y^2+1_{T_1})_{T_1[Y]}\\ &d_r &= d+(Y^2+1_{T_1})_{T_1[Y]}\\ &e_r &= e+(Y^2+1_{T_1})_{T_1[Y]}\\ &f_r &= f+(Y^2+1_{T_1})_{T_1[Y]} \end{aligned}

となるようにコードを書き、c_{r}^2,\ d_{r}^2,\ e_{r}^2,\ f_{r}^2を出力してみます。

### T1=Q[x]/(x^2+1)としたとき、T1[y]/(y^2+1)における-1の平方根

# S2をT1[y]とする
S2, y = PolynomialRing(T1, "y")

# T2をS2[y]/(y^2+1)とする
T2 = ResidueRing(S2, y^2+1)

# S2,T2を出力
println("S2:",S2)
println("T2:",T2)

# S2の元cをarとする
c = S2([ar])

# S2の元dをbrとする
d = S2([br])

# S2の元eをyとする
e = S2([0, 1])

# S2の元fを-yとする
f = S2([0, -1])

# c,d,e,fを出力
println("c=",c)
println("d=",d)
println("e=",e)
println("f=",f)

# T2におけるcをcrとする
cr = T2(c)

# T2におけるdをdrとする
dr = T2(d)

# T2におけるeをerとする
er = T2(e)

# T2におけるfをfrとする
fr = T2(f)

# cr^2,dr^2,er^2,fr^2を出力
println("cr^2=",cr^2)
println("dr^2=",dr^2)
println("er^2=",er^2)
println("fr^2=",fr^2)

出力結果は以下です。

S2:Univariate Polynomial Ring in y over Residue ring of Univariate Polynomial Ring in x over Rationals modulo x^2 + 1
T2:Residue ring of Univariate Polynomial Ring in y over Residue ring of Univariate Polynomial Ring in x over Rationals modulo x^2 + 1 modulo y^2 + 1
c=x
d=-x
e=y
f=-y
cr^2=-1
dr^2=-1
er^2=-1
fr^2=-1

2乗して-1になっていることが確認できました。

Step3

S_3 = T_2[Z],\ T_3 = T_2[Z]/(Z^2+1_{T_2})_{T_2[Z]},

\begin{aligned} g&=c_r\\ h&=d_r\\ i&=e_r\\ j&=f_r\\ k&=Z\\ l&=-Z \end{aligned}

とし

\begin{aligned} &g_r = g+(Z^2+1_{T_2})_{T_2[Z]}\\ &h_r = h+(Z^2+1_{T_2})_{T_2[Z]}\\ &i_r = i+(Z^2+1_{T_2})_{T_2[Z]}\\ &j_r = j+(Z^2+1_{T_2})_{T_2[Z]}\\ &k_r = k+(Z^2+1_{T_2})_{T_2[Z]}\\ &l_r = l+(Z^2+1_{T_2})_{T_2[Z]}\\ \end{aligned}

となるようにコードを書き、g_{r}^2l_{r}^2を出力してみます。

### T2=T1[y]/(y^2+1)としたとき、T2[z]/(z^2+1)における-1の平方根

# S3をT2[z]とする
S3, z = PolynomialRing(T2, "z")

# T3をS3[z]/(z^2+1)とする
T3 = ResidueRing(S3, z^2+1)

# S3,T3を出力
println("S3:",S3)
println("T3:",T3)

# S3の元gをcrとする
g = S3([cr])

# S3の元hをdrとする
h = S3([dr])

# S3の元iをerとする
i = S3([er])

# S3の元jをfrとする
j = S3([fr])

# S3の元kをzとする
k = S3([0, 1])

# S3の元lを-zとする
l = S3([0, -1])

# g~lを出力
println("g=",g)
println("h=",h)
println("i=",i)
println("j=",j)
println("k=",k)
println("l=",l)

# T3におけるg~lをそれぞれgr~lrとする
gr = T3(g)
hr = T3(h)
ir = T3(i)
jr = T3(j)
kr = T3(k)
lr = T3(l)

# gr^2~lr^2を出力
println("gr^2=",gr^2)
println("hr^2=",hr^2)
println("ir^2=",ir^2)
println("jr^2=",jr^2)
println("kr^2=",kr^2)
println("lr^2=",lr^2)

出力結果は以下です。

S3:Univariate Polynomial Ring in z over Residue ring of Univariate Polynomial Ring in y over Residue ring of Univariate Polynomial Ring in x over Rationals modulo x^2 + 1 modulo y^2 + 1
T3:Residue ring of Univariate Polynomial Ring in z over Residue ring of Univariate Polynomial Ring in y over Residue ring of Univariate Polynomial Ring in x over Rationals modulo x^2 + 1 modulo y^2 + 1 modulo z^2 + 1
g=x
h=-x
i=y
j=-y
k=z
l=-z
gr^2=-1
hr^2=-1
ir^2=-1
jr^2=-1
kr^2=-1
lr^2=-1

2乗して-1になっていることが確認できました。

ちょっと確かめ

T_2T_3については剰余環を係数とする多項式環を単項イデアルで割るという、やや面倒なことをしているので、「本当にAbstractAlgebra.jlは想定通り動いてくれているんだろうか?」と不安になりました。

そこで、ちょっと実験してみることにします。

\begin{aligned} {a_0}_r &= 5X+5+(X^2+1)_{\mathbb{Q}[X]}\\ {a_1}_r &= 3X+3+(X^2+1)_{\mathbb{Q}[X]}\\ {a_2}_r &= 2X+2+(X^2+1)_{\mathbb{Q}[X]}\\ {a_3}_r &= X+1+(X^2+1)_{\mathbb{Q}[X]} \end{aligned}

とし、T_1[Y]の元b

b = {a_3}_r Y^3+{a_2}_r Y^2 + {a_1}_r Y + {a_0}_r

とし、T_2の元b_r

b_r = b+(Y^2+1_{T_1})_{T_1[Y]}

とします。

このとき

\begin{aligned} b_r &= b+(Y^2+1_{T_1})_{T_1[Y]}\\ &= {a_3}_r Y^3+{a_2}_r Y^2 + {a_1}_r Y + {a_0}_r+(Y^2+1_{T_1})_{T_1[Y]}\\ &= (X+1+(X^2+1)_{\mathbb{Q}[X]})Y^3+(2X+2+(X^2+1)_{\mathbb{Q}[X]})Y^2+(3X+3+(X^2+1)_{\mathbb{Q}[X]})Y+(5X+5+(X^2+1)_{\mathbb{Q}[X]})+(Y^2+1_{T_1})_{T_1[Y]}\\ &= -(X+1+(X^2+1)_{\mathbb{Q}[X]})Y-(2X+2+(X^2+1)_{\mathbb{Q}[X]})+(3X+3+(X^2+1)_{\mathbb{Q}[X]})Y+(5X+5+(X^2+1)_{\mathbb{Q}[X]})+(Y^2+1_{T_1})_{T_1[Y]}\\ &= (2X+2+(X^2+1)_{\mathbb{Q}[X]})Y+(3X+3+(X^2+1)_{\mathbb{Q}[X]})+(Y^2+1_{T_1})_{T_1[Y]} \end{aligned}

となりますが、この通りになるか、確かめてみましょう。

using AbstractAlgebra

# S1をQ[x]とする
S1, x = PolynomialRing(QQ, "x")

# T1をQ[x]/(x^2+1)とする
T1 = ResidueRing(S1, x^2+1)

# S2をT1[y]とする
S2, y = PolynomialRing(T1, "y")

# T2をS2[y]/(y^2+1)とする
T2 = ResidueRing(S2, y^2+1)

a0 = S1([5,5])
a1 = S1([3,3])
a2 = S1([2,2])
a3 = S1([1,1])

a0r = T1(a0)
a1r = T1(a1)
a2r = T1(a2)
a3r = T1(a3)

b = S2([a0r,a1r,a2r,a3r])
br = T2(b)

println("b=",b)
println("br=",br)

出力結果は以下です。

b=(x + 1)*y^3 + (2*x + 2)*y^2 + (3*x + 3)*y + 5*x + 5
br=(2*x + 2)*y + 3*x + 3

どうやら大丈夫そうだということが確かめられました。

次に

\begin{aligned} {c_0}_r &= {a_0}_rY+{a_0}_r+(Y^2+1_{T_1})_{T_1[Y]}\\ {c_1}_r &= {a_1}_rY+{a_1}_r+(Y^2+1_{T_1})_{T_1[Y]}\\ {c_2}_r &= {a_2}_rY+{a_2}_r+(Y^2+1_{T_1})_{T_1[Y]}\\ {c_3}_r &= {a_3}_rY+{a_3}_r+(Y^2+1_{T_1})_{T_1[Y]} \end{aligned}

とし、T_2[Z]の元d

d = {c_3}_r Z^3+{c_2}_r Z^2 + {c_1}_r Z + {c_0}_r

とし、T_3の元d_r

d_r = d+(Z^2+1_{T_2})_{T_2[Z]}

とします。

このとき

\begin{aligned} d_r &= d+(Z^2+1_{T_2})_{T_2[Z]}\\ &= {c_3}_r Z^3+{c_2}_r Z^2 + {c_1}_r Z + {c_0}_r+(Z^2+1_{T_2})_{T_2[Z]}\\ &= ({a_3}_rY+{a_3}_r+(Y^2+1_{T_1})_{T_1[Y]})Z^3+({a_2}_rY+{a_2}_r+(Y^2+1_{T_1})_{T_1[Y]})Z^2+({a_1}_rY+{a_1}_r+(Y^2+1_{T_1})_{T_1[Y]})Z+({a_0}_rY+{a_0}_r+(Y^2+1_{T_1})_{T_1[Y]})+(Z^2+1_{T_2})_{T_2[Z]}\\ &= -({a_3}_rY+{a_3}_r+(Y^2+1_{T_1})_{T_1[Y]})Z-({a_2}_rY+{a_2}_r+(Y^2+1_{T_1})_{T_1[Y]})+({a_1}_rY+{a_1}_r+(Y^2+1_{T_1})_{T_1[Y]})Z+({a_0}_rY+{a_0}_r+(Y^2+1_{T_1})_{T_1[Y]})+(Z^2+1_{T_2})_{T_2[Z]}\\ &= \{({a_1}_r-{a_3}_r)Y+({a_1}_r-{a_3}_r)+(Y^2+1_{T_1})_{T_1[Y]}\}Z+\{({a_0}_r-{a_2}_r)Y+({a_0}_r-{a_2}_r)+(Y^2+1_{T_1})_{T_1[Y]}\}+(Z^2+1_{T_2})_{T_2[Z]}\\ &= \{(2X+2+(X^2+1)_{\mathbb{Q}[X]})Y+(2X+2+(X^2+1)_{\mathbb{Q}[X]})+(Y^2+1_{T_1})_{T_1[Y]}\}Z+\{(3X+3+(X^2+1)_{\mathbb{Q}[X]})Y+(3X+3+(X^2+1)_{\mathbb{Q}[X]})+(Y^2+1_{T_1})_{T_1[Y]}\}+(Z^2+1_{T_2})_{T_2[Z]} \end{aligned}

となりますが、この通りになるか、確かめてみましょう。

# S3をT2[z]とする
S3, z = PolynomialRing(T2, "z")

# T3をS3[z]/(z^2+1)とする
T3 = ResidueRing(S3, z^2+1)

c0 = S2([a0r,a0r])
c1 = S2([a1r,a1r])
c2 = S2([a2r,a2r])
c3 = S2([a3r,a3r])

c0r = T2(c0)
c1r = T2(c1)
c2r = T2(c2)
c3r = T2(c3)

d = S3([c0r,c1r,c2r,c3r])
dr = T3(d)

println("d=",d)
println("dr=",dr)

出力結果は以下です。

d=((x + 1)*y + x + 1)*z^3 + ((2*x + 2)*y + 2*x + 2)*z^2 + ((3*x + 3)*y + 3*x + 3)*z + (5*x + 5)*y + 5*x + 5
dr=((2*x + 2)*y + 2*x + 2)*z + (3*x + 3)*y + 3*x + 3

どうやら大丈夫そうだということが確かめられました。

感想など

剰余環のように「割る」というのは、初学者の方にとって、わかりにくく感じることがあるようです。私自身も未だにあまり得意ではありません。

特に今回のように何度も割ると、何を扱っているのかわからなくなり、迷子になってしまうことがあると思います。

そんなときに、道すじを整理したり、計算結果を確かめたりする道具として、「コードを書く」というのは有効なのではないか、と感じました。

<AbstractAlgebra.jl関連>

https://github.com/Nemocas/AbstractAlgebra.jl
https://nemocas.github.io/AbstractAlgebra.jl/latest/index.html

※ライセンス
https://github.com/Nemocas/AbstractAlgebra.jl/blob/master/LICENSE.md

<参考にした記事>

https://mathlog.info/articles/3794

Discussion