我有点困惑。我试图用BigInteger
制作一个简单的数学方程式但没有成功。我有256位的3个素数,我测试它如下。我的问题是,当我进行数学运算(a ^ b mod p)时,我得到一个非素数,而且有时候我得到一个256或255位的BigInteger
。为什么会发生这种情况,我该如何避免呢?
Random r = new Random();
byte[] random = new byte[32];
r.nextBytes(random);
randomServerPrimeNumber = BigInteger.probablePrime(256, r);
//System.out.println(randomServerPrimeNumber.isProbablePrime(1));
//System.out.println(value.isProbablePrime(0));
//System.out.println(randomServerPrimeNumber.bitLength());
BigInteger exponent = new BigInteger(Properties.exponent);
BigInteger mod = new BigInteger(Properties.modulus);
BigInteger result = exponent.modPow(randomServerPrimeNumber, mod);
System.out.println(exponent.isProbablePrime(1));//true
System.out.println(randomServerPrimeNumber.isProbablePrime(1));//true
System.out.println(mod.isProbablePrime(1));//true
System.out.println("");
System.out.println(exponent.bitLength());//256
System.out.println(randomServerPrimeNumber.bitLength());//256
System.out.println(mod.bitLength());//256
System.out.println("");
System.out.println(result.isProbablePrime(1));//false all time
System.out.println(result.bitLength());//sometime 256,255,242
答案 0 :(得分:0)
我认为你不小心改变了exponent.modPow(randomServerPriemNumber, mod)
中的参数。 a.modPow(b,c)评估为a^b mod c
,而不是b^a mod c
,但这不应该影响结果,因为所有三个数字都是256位长度素数。至于结果的不同位长,由于BigInteger的大长度是您需要表示的绝对最小位数,因此它对于不同的值会有所不同,即使它们是模数相同的数字。
拿,例如" 10 mod 10"和" 7 mod 10"。第一个计算结果为0,位长度为0.第二个计算结果为7,位长为3.
至于是否应该是或不应该是素数,请原谅我的无知,但我不知道它应该是一个或另一个。我对素数没有任何了解,所以其他人必须对此发表评论。