xorのような関数について
概要
今回はxorと似た関数を探してみました。
xorには以下のような性質があります。
f(x,y) = z の場合以下の式すべてが成り立つ f(y,x) = z f(x,z) = y f(y,z) = x
このような特徴があると「暗号文と鍵から平文」がつくれるので大変便利なのです。
eq関数
eq関数は、双方のbitが等しい時に1になるような関数です。
xorとちょうど反対の出力をします。
#xorの真理値表 0 1 0 0 1 1 1 0 #eqの真理値表 0 1 0 1 0 1 0 1
これもxorと同様な性質がありました
しかしxorと同様に(2^n)の法の中でしか成り立ちません。
補数の余りを使う関数
任意の法 R を利用できる関数として
補数と割り算の余りを利用する方法がありました。
#Rを法とする z = (R-x + R-y) mod R #以下でも同様 z = (-x-y) mod R
これは結構便利そうです。
あとでこれを使った方陣を作ってみます。
方陣の比較
それぞれの関数を使った0から7までの方陣を比較してみました。
方陣の読み方は以下の様な感じ。
xとyの軸を交換しても大丈夫です。
#xorの方陣 0 1 2 3 4 5 6 7 0 0 1 2 3 4 5 6 7 1 1 0 3 2 5 4 7 6 2 2 3 0 1 6 7 4 5 3 3 2 1 0 7 6 5 4 4 4 5 6 7 0 1 2 3 5 5 4 7 6 1 0 3 2 6 6 7 4 5 2 3 0 1 7 7 6 5 4 3 2 1 0 #eqの方陣 0 1 2 3 4 5 6 7 0 7 6 5 4 3 2 1 0 1 6 7 4 5 2 3 0 1 2 5 4 7 6 1 0 3 2 3 4 5 6 7 0 1 2 3 4 3 2 1 0 7 6 5 4 5 2 3 0 1 6 7 4 5 6 1 0 3 2 5 4 7 6 7 0 1 2 3 4 5 6 7 #補数と余りの方陣 0 1 2 3 4 5 6 7 0 0 7 6 5 4 3 2 1 1 7 6 5 4 3 2 1 0 2 6 5 4 3 2 1 0 7 3 5 4 3 2 1 0 7 6 4 4 3 2 1 0 7 6 5 5 3 2 1 0 7 6 5 4 6 2 1 0 7 6 5 4 3 7 1 0 7 6 5 4 3 2
内容は違うのに同じ性質があるのは不思議ですね。
他にも同じ性質の関数がありそうです。
検証用スクリプト
方陣の描画と検証に使ったスクリプトを置いときます。
他の関数を調査するときもつかえるはずです。
#!/usr/bin/env python # -*- encoding: utf-8 -*- charset = u'01234567' max = len(charset) print " ", for x in range(max): print charset[x], print def f(x,y): # z = (x^y) #xor # z = (~(x ^ y) & (max-1)) #eq z = (-x-y)%max #modr return z for x in range(max): print charset[x], for y in range(max): print charset[f(x,y)], print #check for x in range(max): for y in range(max): z = f(x,y) if (f(y,x) <> z or f(x,z) <> y or f(y,z) <> x ): print "error %s %s" % (charset[x],charset[y])