メビウス変換

# 3複素数を2セット作る
# zsをwsに写す
zs <-runif(3)+1i*runif(3)
ws <- runif(3)+1i*runif(3)

# 行列方式のために、3複素数が定める2x2行列を作る
my.moebius.m <- function(zs){
	matrix(c(zs[2]-zs[3],-zs[1]*(zs[2]-zs[3]),zs[2]-zs[1],-zs[3]*(zs[2]-zs[1])),byrow=TRUE,2,2)
}
# 3複素数を0,1,無限大に写す行列を二つ作る(ただし、同次座標として)
F <- my.moebius.m(zs)
G <- my.moebius.m(ws)
# FとGの逆行列を使って、zs->wsの行列は
H <- solve(G) %*% F
WS <- H %*% rbind(zs,rep(1,3))
# 同次座標から、複素数に戻す
WS[1,]/WS[2,]
# 一致する
ws

# 明示公式
my.moebius <- function(zs,ws){
	z1 <- zs[1];z2 <- zs[2];z3 <- zs[3];
	w1 <- ws[1];w2 <- ws[2];w3 <- ws[3];
	ret <- function(z){
		(w1*(w3-w2)*(z3-z1)*(z-z2)-w2*(w3-w1)*(z3-z2)*(z-z1))/((w3-w2)*(z3-z1)*(z-z2)-(w3-w1)*(z3-z2)*(z-z1))
	}
	ret
}

fm <- my.moebius(zs,ws)
fm(zs)
ws
> # 同次座標から、複素数に戻す
> WS[1,]/WS[2,]
[1] 0.9522175+0.4753116i 0.1778629+0.9514855i 0.1017655+0.5371333i
> # 一致する
> ws
[1] 0.9522175+0.4753116i 0.1778629+0.9514855i 0.1017655+0.5371333i
> fm <- my.moebius(zs,ws)
> fm(zs)
[1] 0.9522175+0.4753116i 0.1778629+0.9514855i 0.1017655+0.5371333i
> ws
[1] 0.9522175+0.4753116i 0.1778629+0.9514855i 0.1017655+0.5371333i