计算 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;
}
这解决了问题。
我试图找出一种使用 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;
}
这解决了问题。