计算 java 中的模逆

Calculating modulo inverse in java

我试图找出一种使用 java 计算模逆的方法,所以我编写了这个函数来实现它:

public static int privatekey(int primeprod, int e, int lambda)
{
    Random random = new Random();
    float d = 0;
    //extended euler's theorem is
    //d = (1 + x*lambda) / e
    //d is smaller than primeprod
    while(true)
    {
        int d = random.nextInt(200) + 1;
        System.out.println("seed: "+x);
        var = (1 + (x*lambda)) / e;
        System.out.println("var: "+d);
        if(isInteger(d) && d < primeprod)
        {
            break;
        }
    }
    int finalvar = (int)d;
    return finalvar;
}

我觉得不对,所以我把上面使用的欧几里德定理扩展反转如下

1 + x.lambda
------------- = d (this one is the equation to find out d when x is any integer)
     e
     

de = 1 + x.lambda

de - 1 = x.lambda

de - 1
------- = x (this one is to check whether the value obtained by the above equation is true or not by checking if x is the same value we had chosen for our calculation in the first place)
lambda

在检查之后,我发现我为了检查错误而求解的逆方程中得到的 x 的值不等于而是近似于我生成的原始随机值。

例如采用这些值:

e = 327
lambda = 484
x = 76

We get d as 112.0

later We reverse The equation to find the value of x to confirm

we get:
x = 75.667355372 (Which is approximate to the original value)

我不知道哪里出了问题。

要查看完整程序,请访问 this link。

如果我在这里做错了什么,请告诉我。

提前致谢!

好的,我得到了这个问题的答案。 问题是我在 integer 上执行算术运算,所以我得到的结果是 integer.

我后来使用 Double 而不是使用 integer 来执行相同的操作并解决了问题。

public static int privatekey(Double primeprod, Double e, Double lambda)
{
    Random random = new Random();
    float d = 0;
    //extended euler's theorem is
    //d = (1 + x*lambda) / e
    //d is smaller than primeprod
    while(true)
    {
        int d = random.nextInt(200) + 1;
        System.out.println("seed: "+x);
        var = (1 + (x*lambda)) / e;
        System.out.println("var: "+d);
        if(isInteger(d) && d < primeprod)
        {
            break;
        }
    }
    int finalvar = (int)d;
    return finalvar;
}

这解决了问题。