如何在java中生成离散对数

时间:2011-04-26 20:17:07

标签: java cryptography discrete-mathematics logarithm

我正在寻找一种简短的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,我会说这个吗?

1 个答案:

答案 0 :(得分:3)

http://en.wikipedia.org/wiki/Discrete_logarithm列出了7种用于计算离散对数的算法。

为了理解离散对数本身,我会用笔和纸构建一个小循环组生成器的所有幂的表。对数是反向的,因此如果翻转列,则已经有了对数表。

朴素算法的工作方式与此类似,只是你不存储表而是简单地循环乘以a直到当前幂匹配x并输出乘法加上完成加上1作为x base a的对数。 / p>