この論文 (3 ページと 8 ページ) を読んでいます: http://acl.ldc.upenn.edu/P/P05/P05-1077.pdfでは、署名の順列を生成する順列関数を定義しています。署名は「1001」のようなビットの文字列です
順列関数を次のように定義します。
ただし、適用すると機能しません。文字列「1001」があるとします。そのインデックスは {0,1,2,3} です。目的は、たとえば {2,3,0,1} のようにインデックスを並べ替えることです。p = 7、a =1、b = 2 とします。次に、インデックスを次のように並べ替える必要があります。
pi(0) = (0+2) mod 7 = 2
pi(1) = (1+2) mod 7 = 3
pi(2) = (2+2) mod 7 = 4 <<<<<< ここで、インデックス スペースを超える間違った値が生成されるため、問題が発生します。
pi(3) = (3+2) mod 7 = 5 <<<<<< ここは同じ
したがって、そもそもインデックスとして 4 と 5 がないため、無効な {2,3,4,5} として新しいインデックスが作成されます。
私のソリューションの何が問題になっていますか? 私は何か間違ったことをしていますか?
文字列のすべての順列を生成するスタックオーバーフローの投稿を見てきました。しかし、特定の順列関数を使用して 1 つの順列を生成したいと考えています。複数の文字列に対して同じ順列関数を使用したいからです。次に、異なるパラメーターを使用して別の順列関数を作成し、同じ文字列/署名のセットに新しい順列関数を適用できるようにしたいと考えています。
編集:同じアイデアを適用するPythonでこのコードを見つけましたが、残念ながら以前にPythonを使用したことはありません。
class Permutation(object):
def __init__(self, maximumValue):
if not isPrime(maximumValue): raise Exception('Maximum value should be prime')
self.p, self.a, self.b = maximumValue, random.choice(range(maximumValue)[3::2]), random.choice(range(maximumValue))
def applyFunction(self, x): return (self.a*x+self.b)%self.p
def __eq__(self, other): return self.a==other.a and self.b==other.b and self.p==other.p
def __str__(self): return 'p: %s, a: %s, b: %s'%(self.p, self.a, self.b)
コードはこちらから: https://github.com/kykamath/streaming_lsh/blob/master/streaming_lsh/classes.py