java - 为什么我的费马素数检验方法不起作用?
问题描述
我正在尝试实现一种检查任何整数的方法,如果它是使用费马素数测试的素数,则返回 true。
我根据输入是否小于 40 来划分问题。如果输入小于 40,那么我对每个整数应用测试,直到 n-1。否则,如果整数大于 40,则对直到 40 的每个整数都应用测试。但是,对于某些素数,它会失败。
public static boolean isPrime (double n){
int counter=0;
boolean isPrime=false;
if(n<40) {
for (int a = 2; a < n - 1; a++) {
if (Math.pow(a, n - 1) % n == 1) counter++;
}
if (counter == n - 3) isPrime = true;
}
else {
for (int a = 2; a <= 40; a++) {
if (Math.pow(a, n - 1) % n == 1) counter++;
}
if (counter == 39) isPrime = true;
}
return isPrime;
}
这是逻辑问题还是其他问题?
解决方案
Math.pow 适用于双精度数,结果只是近似值。另一方面,模数适用于范围高达 20 亿多一点的整数,你的 pow 是否会产生一些比这更大的数字?(17^18 似乎是 19 的可靠赌注……)
那么如何解决这个问题:您可以使用乘法和对整数取模来实现自己的 pow(a,b,n) (幂模 n)。那应该可以正常工作。使用一系列乘法创建一个函数来提高 a 到 b 的幂,在每一步之后将 %n 应用于中间结果......
推荐阅读
- sql - Is there a way to calculate correlation between two variables in SQL?
- google-sheets - 在 Google 表格中整理/汇总特定数据的有效方法
- php - PHP MySQL根据列/行值选择多个表
- r - 使用lowess平滑R中的data.table列时出现意外结果
- javascript - 如何将一些信息从一个 get/post 传递到另一个 get/post
- javascript - MongoDB 从日期中挑选数据
- python - Python:获取表中每一行的值的排序位置
- php - 在 WooCommerce 修复问题中购买 x 数量的特定产品类别时,根据用户角色应用折扣
- kubernetes - 入口重定向到 localhost tcp 服务
- c# - ASP.NET 异步操作返回类型