整数の配列を大きな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はまた後日書きます。