我正在寻找一种简短的java算法,它有助于在循环组Z * p中找到LOGa(x)。 我的方法
将是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,我会说这个吗?
答案 0 :(得分:3)
http://en.wikipedia.org/wiki/Discrete_logarithm列出了7种用于计算离散对数的算法。
为了理解离散对数本身,我会用笔和纸构建一个小循环组生成器的所有幂的表。对数是反向的,因此如果翻转列,则已经有了对数表。
朴素算法的工作方式与此类似,只是你不存储表而是简单地循环乘以a直到当前幂匹配x并输出乘法加上完成加上1作为x base a的对数。 / p>