読者です 読者をやめる 読者になる 読者になる

猫尾製作所

あまりアテにしないでね

階乗進法と順列の対応のプログラミング

数学 Ruby プログラミング 代数学
# 階乗の定義
def fact(n)
	if n > 0 then
		return (n * fact(n-1))
	elsif n == 0 then
		return 1
	else
		retrun nil
	end
end

# 自然数 n から階乗進法に変換
def numtofactb(n)
	d = 1
	while fact(d+1) <= n do
		d += 1
	end
	
	a = Array.new(d+1)
	while d > 0 do
		fd = fact(d)
		q = n / fd
		n = n % fd
		a[d] = q
		d -= 1
	end
	return a
end

# 階乗進法から自然数 n に変換
def factbtonum(a)
	d = a.length
	n = 0
	for i in 1..(d-1) do
		n += a[i] * fact(i)
	end
	return n
end

# 階乗進法から順列に変換
def factbtopar(len, a)
	p = Array.new(len)
	s = Array.new(len)
	for i in 0..(len-1)
		s[i] = i
	end
	
	i = len-1
	while i > 0 do
		p[i] = s[a[i]]
		s.delete(p[i])
		i -= 1
	end
	p[0] = s[0]
	
	return p
end

# 順列から階乗進法に変換
def partofactb(p)
	len = p.length()
	a = Array.new(len)
	s = Array.new(len)
	for i in 0..(len-1)
		s[i] = i
	end
	
	for i in 1..(len-1) do
		a[i] = s.index(p[len-i])
		s.delete(p[len-i])
	end
	
	return a
end