巡回群 Z*p で LOGa(x) を見つけるのに役立つ Java の短くて単純なアルゴリズムを探しています。私の方法
log(prime_number, a, x) になります
これは巡回群 Z*p で LOGaX を計算します。
徹底的な検索でこれを行うにはどうすればよいですか、または簡単な方法はありますか、
そのため、個別のログを理解するのに役立つように、徹底的な検索を行いました。
//log(p,a,x) will return logaX in the cyclic group Z*p where p is
//prime and a is a generator
public static BigInteger log(BigInteger p,BigInteger a,BigInteger x){
boolean logFound = false;
Random r = new Random();
BigInteger k = new BigInteger(p.bitCount(),r);
while(!logFound){
if(a.modPow(k, p).equals(x)){
logFound = true;
}else{
k = new BigInteger(p.bitCount(),r);
}
}
//i dont think this is right
return a
}
巡回群 Z*p の LOGaX を返したいのですが、ここでこれを行っていますか、それとも何が欠けていますか?
だから私は今kを返し、徹底的な検索を行っています@pauloEbermann私は何をすべきか理解していませんk=k.multiply(a).mod(p)
私の新しいコードは次のようになります
//log(p,a,x) will return LOGaX in the cyclic group Z*p where p is
//prime and a is a generator
public static BigInteger log(BigInteger p,BigInteger a,BigInteger x){
boolean logFound = false;
Random r = new Random();
BigInteger k = BigInteger.ONE;
while(!logFound){
if(a.modPow(k, p).equals(x)){
logFound = true;
}else{
k = k.add(BigInteger.ONE);
}
}
return k;
}
このテストデータで
public static void main(String[] args) {
BigInteger p = new BigInteger("101");
BigInteger a = new BigInteger("3");
BigInteger x = new BigInteger("34");
System.out.println(log(p,a,x));
}
したがって、これは k = 99 を返します
これは、log3(34) mod 101 が 99 に等しいことを意味します。これを言うのは正しいでしょうか?