n進法とフラクタル

  • 前の記事で、分割数はl進体と関係していて、それはフラクタルにつながるということを書いた
  • また「複素進法」というものも定義できることが分かった
  • これらから得られる「進法」の意味とは、次のようになる
    • ユニットがある(n進法なら1、複素進法なら複素数)
    • ユニットのべきz^kがある
    • べきに関して再帰処理をする
  • 「進法」というものが何なのかを考えるためにもう少し整理する
    • 通常のn進法では、\sum_{i = -\infty}^{\infty} a_i n^iとあらわして、n自然数であるとか、a = 0,1,...(n-1)であるとかの制約を入れている。また、数直線上の値を表現するという(暗黙の)了解もある
    • 複素進法では、数直線上の値ではなくて、複素平面上の値を表現している
  • じゃあ、ということで、2方向に考えを広げられそうだ(3方向か?)
    • (1) 数直線上の展開(普通の進法)で「再帰性(フラクタル的)」な扱いをして、それを「フラクタル的絵」にすることができるか
    • (2) 次元を3以上に上げるとすればどうするか(そもそも、整数次元でないのがフラクタルの良さだから、対応する空間ももっと自由にすることもできそうだ)
    • (3) これは、どう拡張したらよいのか白紙だが、「ユニット(今は1とか)」を自由にして、「係数(今は0以上の整数とか)」も自由にする
  • Rでやってみる
    • 無限数直線(とりあえず0から\inftyまで)を有限範囲に納まる折れ線にする。それは再帰性のある折れ線
    • aとbとの2点について
    • n進でt-th 点の座標を返す
    • 2次元平面上の2点の座標a,b
    • n進法で、ある位の値がt = 0,1,...(n-1)とする
    • a,b2点を乗せた円であって、その2点を通る半径が直交するものとする
    • そのうえで、その四半円をn等分した円周上の点をtの値に応じて対応づける
    • 複数の位の数字があるので、この四半円化処理を位ごとに再帰的に細かくしていく

# 2点a,bを通る四半円上の線分の両端点の座標を計算する
my.k.shin <- function(a,b,n,t){
# 2端点の中間点
	center <- (a+b)/2
	a.c <- a-center
# 点aをcenterを中心に-pi/4回転させる	
	a.c2 <- matrix(c(0,1,-1,0),byrow=TRUE,2,2) %*% a.c
# それを使って、四半円の中心を求める
	center <- center + a.c2
	a.c <- a-center
# tの値に応じて新たな回転の回転角を決める(線分をとりたいので、2通りの回転角を作る
	theta <- t*pi/(n*2)
	theta2 <- (t+1)*pi/(n*2)
# 回転行列
	m <- matrix(c(cos(theta),-sin(theta),sin(theta),cos(theta)),byrow=TRUE,2,2)
	m2 <- matrix(c(cos(theta2),-sin(theta2),sin(theta2),cos(theta2)),byrow=TRUE,2,2)
	incl <- m %*% a.c
	incl2 <- m2 %*% a.c
	return(list(a=center + incl, b = center + incl2))
}

# 再帰的に座標を絞って行く
my.k.shin2 <- function(x,n){
# 第1の位は(0,0)-(1,0)の線分からスタート
	A <- c(1,0)
	B <- c(0,0)
	tmp <- my.k.shin(A,B,n,x[1])
# 第2以降の位は、それまでの位で求めた線分を両端とした四半円上の点として定める。その処理を位の数だけ繰り返し
	for(i in 2:length(x)){
		tmp <- my.k.shin(tmp$a,tmp$b,n,x[i])
	}
	tmp
}
# 桁数
k <- 7
# n進法
n <- 2
# ランダムにd個の点を発生させる
d <- 10000
# 1行あたり、1つの値。ただし、各列の値は、n進法の係数
r <- matrix(sample(0:(n-1), k*d, replace=TRUE),ncol=k)
# それぞれの値に2次元線分を定める4つの値(x1,y1,x2,y2)を求めたい
# その格納庫
X <- matrix(0,d,4)
# 1個ずつやろう
for(i in 1:d){
	tmp <- my.k.shin2(r[i,],n)
	X[i,] <- c(tmp$a,tmp$b)
}
# d個の値を計算して
tmpX <- t(r) * n^(k:1)
v <- apply(tmpX,2,sum)
# 値の小さい順を求める
ord <- order(v)
xlim <- ylim <- range(X)

plot((X[,1]+X[,3])/2,(X[,2]+X[,4])/2,xlim = xlim, ylim = ylim)
# 小さい順に並べて、タイプ "l"でプロットすれば、フラクタル的な絵
plot(c(X[ord,1],X[ord,3]),c(X[ord,2],X[ord,4]),xlim = xlim, ylim = ylim,type="l")