lucastest.java
来自「一个一元曲线多项式数值演示例子」· Java 代码 · 共 100 行
JAVA
100 行
package numbercruncher.primeutils;
import numbercruncher.mathutils.*;
/**
* An implemention of the the Lucas test for primality.
*/
public class LucasTest {
private static LucasStatus status = new LucasStatus();
/** number to test for primality */
int p;
/** prime factors of p-1 */
int q[];
/** caller of the test */
LucasCaller caller;
/**
* Constructor.
* @param p the number to test for primality
* @param caller the caller of the test
*/
public LucasTest(int p, LucasCaller caller) {
this.p = p;
this.caller = caller;
q = PrimeFactors.factorsOf(p - 1);
}
/**
* Perform the Lucas test.
* @return true if p is prime, false if p is composite
*/
public boolean test() {
// Try integers a from 2 through p.
for (int a = 2; a <= p; ++a) {
if (passPart1(a) && passPart2(a)) {
return true; // prime
}
}
return false; // composite
}
/**
* Test if integer a passes the first part of the test.
* @param a the value of a
* @return true if [a^(p-1)]%p == 1, else false
*/
private boolean passPart1(int a) {
int exponent = p - 1;
int value = ModuloArithmetic.raise(a, exponent, p);
// Report status back to the caller.
if (caller != null) {
status.a = a;
status.q = 1;
status.exponent = exponent;
status.value = value;
status.pass = (value == 1);
caller.reportStatus(status);
}
return (value == 1); // pass if it's 1
}
/**
* Test if integer a passes the second part of the test.
* @param a the value of a
* @return true if [a^(p-1)/q]%p != 1 for all prime factors q,
* else false
*/
private boolean passPart2(int a) {
int pm1 = p - 1;
// Loop to try each prime factor.
for (int i = 0; i < q.length; ++i) {
int exponent = pm1 / q[i];
int value = ModuloArithmetic.raise(a, exponent, p);
// Report status back to the caller.
if (caller != null) {
status.a = a;
status.q = q[i];
status.exponent = exponent;
status.value = value;
status.pass = (value != 1);
caller.reportStatus(status);
}
if (value == 1) {
return false; // fail
}
}
return true; // pass
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?