『多元環とは、可換環上の加群としての構造を持ち、その構造と両立しているような積を持つ代数的構造のことである。』

  • 多元環とは、可換環上の加群としての構造を持ち、その構造と両立しているような積を持つ代数的構造のことである。』とはどういうことか。
    • 代数的構造の考え方について、ようやく、頭の中に「道筋」が見えた感じがする。群・環・体、だけをやってもよく見えず、Coalgebraとか、関数解析、双線形、汎関数作用素環などをなんだかなんだと、わからないなりに頭のバッファーに浮かばせたことで、つながりができたことが大きいかもしれない
  • 「集合」で考える(Wiki)
  • 集合とその上の演算
  • f(x_1,x_2,...,x_k)はk-項演算
  • 特に二項演算の場合を取り上げることも多い
  • 二項演算の代数
  • 集合があって、集合の要素のペアに二項演算があって、その演算の結果が集合に含まれる、それが代数的構造
  • モナド
    • 2つの要素とそれを結びつける行列でできた関数との組
n.elem <- 5
s <- LETTERS[1:n.elem]
s
M <- matrix(sample(1:n.elem,n.elem^2,replace=TRUE),n.elem,n.elem)
M
f.monad <- function(a,b,s){
	a.id <- which(s==a)
	b.id <- which(s==b)
	M <- matrix(sample(1:n.elem,n.elem^2,replace=TRUE),n.elem,n.elem)
	ret.id <- M[a.id,b.id]
	s[ret.id]
}

f.monad("A","C",s)
matrix(s[M],dim(M))
> s
[1] "A" "B" "C" "D" "E"
> M
     [,1] [,2] [,3] [,4] [,5]
[1,]    3    1    5    2    4
[2,]    5    4    1    4    2
[3,]    3    4    2    3    3
[4,]    5    2    1    1    2
[5,]    1    4    5    5    1
> f.monad("A","C",s)
[1] "A"
> matrix(s[M],dim(M))
     [,1] [,2] [,3] [,4] [,5]
[1,] "C"  "A"  "E"  "B"  "D" 
[2,] "E"  "D"  "A"  "D"  "B" 
[3,] "C"  "D"  "B"  "C"  "C" 
[4,] "E"  "B"  "A"  "A"  "B" 
[5,] "A"  "D"  "E"  "E"  "A" 
n.elem <- 5
# やみくもに探してみよう
n.iter <- 10000
ret <- list()
cnt <- 0
for(i in 1:n.iter){
# 適当に行列を作る
	M <- array(sample(1:n.elem,n.elem^2,replace=TRUE),rep(n.elem,2))
# 3要素順列
	cmb <- combn(n.elem,3)
# 結合法則のチェック
	check <- TRUE
	for(j in 1:length(cmb[1,])){
		first <- cmb[1,j]
		second <- cmb[2,j]
		third <- cmb[3,j]
		A <- M[M[first,second],third]
		B <- M[first,M[second,third]]
		if(A != B){
			check <- FALSE
			break
		}
	}
	if(check){
		cnt <- cnt + 1
		ret[[cnt]] <- M
	}
}
# 結合法則OKの割合
cnt/n.iter
# その1例
ret[[sample(1:cnt,1)]]
> cnt/n.iter
[1] 1e-04
> ret[[sample(1:cnt,1)]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    3    4    1
[2,]    1    4    3    4    1
[3,]    2    1    2    4    3
[4,]    5    3    5    1    4
[5,]    5    5    1    1    1
# 単位元
n.elem <- 5

n.iter <- 10000
ret <- list()
cnt <- 0
for(i in 1:n.iter){
	M <- array(sample(1:n.elem,n.elem^2,replace=TRUE),rep(n.elem,2))
	M. <- M - 1:n.elem
	tmp <- apply(M.^2,2,sum)
	if(prod(tmp)==0){
		cnt <- cnt + 1
		ret[[cnt]] <- t(M)
	}
}
cnt/n.iter
ret[[sample(1:cnt,1)]]
> cnt/n.iter
[1] 0.0011
> ret[[sample(1:cnt,1)]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    3    1    1
[2,]    5    3    3    5    2
[3,]    2    1    1    2    3
[4,]    1    2    3    4    5
[5,]    2    3    4    4    4
  • 群は単位元を持って逆元を持って、結合法則を満足する
    • まず単位元を持って逆元を持つような構造を生物に探索させる
n.elem <- 4

n.iter <- 100000
ret <- list()
ret.idnt <- list()
ret.inv <- list()
cnt <- 0
for(i in 1:n.iter){
	M <- array(sample(1:n.elem,n.elem^2,replace=TRUE),rep(n.elem,2))
	M. <- M - 1:n.elem
	tmp <- apply(M.^2,2,sum)
	idnt <- which(tmp==0)
	if(length(idnt)>0){
		for(j in 1:length(idnt)){
			tmp.M <- M - idnt[j]
			tmp <- apply(tmp.M,1,prod)
			if(sum(tmp^2)==0){
				cnt <- cnt + 1
				ret[[cnt]] <- t(M)
				ret.idnt[[cnt]] <- idnt[j]
			}
		}
	}

}
cnt/n.iter
a <- sample(1:cnt,1)
ret[[a]]
ret.idnt[[a]]
> cnt/n.iter
[1] 0.00301
> a <- sample(1:cnt,1)
> ret[[a]]
     [,1] [,2] [,3] [,4]
[1,]    1    2    1    3
[2,]    4    4    4    3
[3,]    1    3    1    3
[4,]    1    2    3    4
> ret.idnt[[a]]
[1] 4
    • ついで、結合法則も満足するまで探索させる。それが群
n.elem <- 4

n.iter <- 100000
ret <- list()
ret.idnt <- list()
ret.inv <- list()
cnt <- 0
for(i in 1:n.iter){
	M <- array(sample(1:n.elem,n.elem^2,replace=TRUE),rep(n.elem,2))
	M. <- M - 1:n.elem
	tmp <- apply(M.^2,2,sum)
	idnt <- which(tmp==0)
	check.idnt <- (length(idnt)>0)
	
	cmb <- combn(n.elem,3)
	check <- TRUE
	for(j in 1:length(cmb[1,])){
		first <- cmb[1,j]
		second <- cmb[2,j]
		third <- cmb[3,j]
		A <- M[M[first,second],third]
		B <- M[first,M[second,third]]
		if(A != B){
			check <- FALSE
			break
		}
	}

	
	if(check.idnt & check){
		for(j in 1:length(idnt)){
			tmp.M <- M - idnt[j]
			tmp <- apply(tmp.M,1,prod)
			if(sum(tmp^2)==0){
				cnt <- cnt + 1
				ret[[cnt]] <- t(M)
				ret.idnt[[cnt]] <- idnt[j]
			}
		}
	}

}
cnt/n.iter
a <- sample(1:cnt,1)
ret[[a]]
ret.idnt[[a]]
> cnt/n.iter
[1] 3e-04
> ret.idnt[[a]]
[1] 4
> a <- sample(1:cnt,1)
> ret[[a]]
     [,1] [,2] [,3] [,4]
[1,]    4    1    4    1
[2,]    2    4    4    3
[3,]    4    2    4    4
[4,]    1    2    3    4
> ret.idnt[[a]]
[1] 4
  • アーベル群・可換群
    • さらにf(a,b)=f(b,a)
    • これは行列探索的には、対象行列かどうか…
    • 作ってみてから条件を満足することをするよりは、対象行列を作って、ほかの条件の満足を確認する、と言う方が、ランダム発生的には簡単なので
n.elem <- 3

n.iter <- 1000
ret <- list()
ret.idnt <- list()
ret.inv <- list()
cnt <- 0
for(i in 1:n.iter){
	tmp.v <- sample(1:n.elem,n.elem*(n.elem-1)/2,replace=TRUE)
	M <- matrix(0,n.elem,n.elem)
	M[upper.tri(M)] <- tmp.v
	M <- (M + t(M))
	diag(M) <- 1:n.elem
	#M <- array(sample(1:n.elem,n.elem^2,replace=TRUE),rep(n.elem,2))
	M. <- M - 1:n.elem
	tmp <- apply(M.^2,2,sum)
	idnt <- which(tmp==0)
	check.idnt <- (length(idnt)>0)
	
	cmb <- combn(n.elem,3)
	check <- TRUE
	for(j in 1:length(cmb[1,])){
		first <- cmb[1,j]
		second <- cmb[2,j]
		third <- cmb[3,j]
		A <- M[M[first,second],third]
		B <- M[first,M[second,third]]
		if(A != B){
			check <- FALSE
			break
		}
	}

	
	if(check.idnt & check){
		for(j in 1:length(idnt)){
			tmp.M <- M - idnt[j]
			tmp <- apply(tmp.M,1,prod)
			if(sum(tmp^2)==0){
				cnt <- cnt + 1
				ret[[cnt]] <- t(M)
				ret.idnt[[cnt]] <- idnt[j]
			}
		}
	}

}
cnt/n.iter
a <- sample(1:cnt,1)
ret[[a]]
ret.idnt[[a]]
> cnt/n.iter
[1] 0.118
> a <- sample(1:cnt,1)
> ret[[a]]
     [,1] [,2] [,3]
[1,]    1    1    2
[2,]    1    2    3
[3,]    2    3    3
> ret.idnt[[a]]
[1] 2
    • 2つの二項演算があって、片方はアーベル群的演算、もう片方は半群(またはモノイド)である
    • ここまでなら、一つの集合に二つの演算を勝手に探索すればよいけれど
    • さらに、アーベル群的演算と半群(モノイド)的演算との間に、分配法則が成り立つ(a+b)c=ac +bc、ので、さらに狭い
    • 結合法則だけOKっていうのなら
# 結合法則
n.elem <- 4

n.iter <- 10000
ret1 <- ret2 <- list()
cnt <- 0
for(i in 1:n.iter){
	M1 <- matrix(sample(1:n.elem,n.elem^2,replace=TRUE),n.elem,n.elem)
	M2 <- matrix(sample(1:n.elem,n.elem^2,replace=TRUE),n.elem,n.elem)
	cmb <- combn(n.elem,3)
	check <- TRUE
	for(j in 1:length(cmb[1,])){
		first <- cmb[1,j]
		second <- cmb[2,j]
		third <- cmb[3,j]
		ab.c <- M2[M1[first,second],third]
		ac.bc <- M1[M2[first,third],M2[second,third]]
		if(ab.c != ac.bc){
			check <- FALSE
			break
		}
	}
	if(check){
		cnt <- cnt + 1
		ret1[[cnt]] <- M1
		ret2[[cnt]] <- M2
	}
}
cnt/n.iter
a <- sample(1:cnt,1)
ret1[[a]]
ret2[[a]]
> cnt/n.iter
[1] 0.0133
> a <- sample(1:cnt,1)
> ret1[[a]]
     [,1] [,2] [,3] [,4]
[1,]    1    2    2    1
[2,]    1    2    2    3
[3,]    4    4    3    4
[4,]    1    3    1    3
> ret2[[a]]
     [,1] [,2] [,3] [,4]
[1,]    2    4    2    1
[2,]    3    4    1    1
[3,]    1    2    2    4
[4,]    4    4    2    1
    • 体は、環の二つの演算の両方が群の演算(片方はアーベル群、もう片方はアーベル群とは限らない群)。ただし、後者では「0元」を除いた元が群になっていればよい
    • じゃあ、ここまで来たとして、「どうして、数の歴史では、こんなに制約のきつい構造からスタートして、だんだんに単純化した構造へと理解が進んだのか」ということ。数の認識機構である神経系が「体」的になっているから???
  • モジュール(加群)
    • 集合Aの演算を係数と呼ばれる、集合Aの要素とは別のものの集合Bとその演算(それが環をなす・体をなす)と組み合わせて構築した、演算の要素と演算ルールの系
    • ベクトルが集合Aで、係数が実数体だったり、複素数体だったりする
    • a X + b Yというようなベクトルの係数倍の和とか、a(bX+cY)=abX + acYとか、係数の分配法則とかがうまいこと成り立たせたい、という「ベクトル空間の記述」の気持ちを反映しているので、係数は体であることを要求(環、でも)よい
    • 以下は、分配法則を守らせるだけで、「環(体)」的なものを作り、それとは別に、1つの演算ができる群とを組み合わせてやってみる
    • 「環(体)」的な方がn.1個の要素があって、もう一つの「群」的な方がn.2個の要素があったとき、n.1^{n.2}通りの要素が取扱いの対象となって、これがいわゆる実数k次元空間である\mathcal{R}^kのようなもの
    • ただし、「環(体)」的な方がa_1,...,a_{n.1}、「群」的な方がx_1,...,x_{n.2}のときに、(a_1x_1,a_2x_1,...,a_{n.1}x_1) \otimes (a_1x_2,a_2x_2,...,a_{n.1}x_2) \otimes ... \otimes (a_1x_{n.2},a_2x_{n.2},...,a_{n.1}x_{n.2})が対象になるも、たとえばa_{i1} x_{j1} + a_{i2} x_{j2} = a_{i1} (x_{j1}+x_{j2}) + (a_{i2}-a_{i1}) x_{j2}のようになるが、これはa' x' + a'' x_{j2}、ただしa' = a_{i1}+a_{i2}, a''=a_{i2}-a_{i1},x'=x_{j1}+x_{j2}、となってa',a'',x'がやはり「環(体)」「群」の要素であるから、「等しいもの」に複数の表し方がある〜「同じ要素がかぶ」るので、「いわゆるベクトル空間」とは違うことになるのだが、ここでは、「集合」の「直積」になる、という話と言うことで。
  • 多元環
    • ひとつ前で、「環(体)」を係数として加法がある「群」がモジュールだったが、この「係数」の方には乗法があるけれど、全体には乗法がない
    • 乗法がないので、うまく乗せてやりたくなる
    • それを乗せると多元環(加法と乗法があるので環)
    • と、ここまで来ると、『多元環とは、可換環上の加群としての構造を持ち、その構造と両立しているような積を持つ代数的構造のことである。』、とさらっと書かれていても、「はいはい、そう書くことになるよね」とそれなりに納得する