整数の配列を大きな1つの大きな整数にしてしまうアルゴリズム(なんちゃって暗号)

サマーウォーズからヒントを得て。

おおまかに言うと

暗号化:整数列(元の数列)→(変換)→大きな整数(暗号数)
復号化:「暗号数」を整数列(鍵数列)でどんどん割っていくと、その余りとして「元の数列」が現れる。

379192800 #暗号数
[1,1,2,3,5,8,13,21,34,55,89, ..] #鍵数列(フィボナッチ数列)
379192800÷2=132784440 余り0
(上の式の商)÷3=44261480  余り0
(上の式の商)÷5=8852296   余り0
(上の式の商)÷8=1106537   余り0
(上の式の商)÷13=85118    余り3
(上の式の商)÷21=4053     余り5
(上の式の商)÷34=119      余り7
(上の式の商)÷55=2        余り9
(上の式の商)÷3 =1        余り2
[3,5,7,9,2] #元の数列

活用方法

誕生日のメッセージをかな文字列で書き、ポケベル方式で整数列に変換して、最小限のヒントと共に送り付ける、など。

ソースコード

こういうとき、整数の上限がないRubyの強みが活かされる。
鍵数列はフィボナッチ数列の13以降を採用。必然的に整数列の数字は0〜12に限られる。

def fibo_encode(original_array)
	f1 = 8
	f2 = 13
	fn = f2
	len = original_array.length
	fibos = Array.new(len)
	output = 0
	fibos.each_index{|i|
		fibos[len-1 - i] = fn
		fn = f1 + f2
		f1 = f2
		f2 = fn
	}
	fibos.each_index{|i|
		output = output*fibos[i] + original_array[len-1 - i]
	}
	return output * 2*3*5*8 #いちおう
end

decodeはまた後日書きます。