对小数的最快素数测试

2024-04-12

我在业余时间玩了 Euler 项目,现在我需要做一些重构。我已经实施了 Miller-Rabin 以及一些筛子。我以前听说过,对于较小的数量(例如数百万以下),筛子实际上更快。有人有这方面的信息吗?谷歌并没有多大帮助。


Yes, you'll find with most algorithms that you can trade space for time. In other words, by allowing the use of more memory, the speed is greatly increased *a.

我其实不knowMiller-Rabin 算法,但是,除非它比单个左移/添加和内存提取更简单,否则它将被预先计算的筛子从水中吹出。

这里重要的是预先计算的。就性能而言,预先计算这样的事情是个好主意,因为前一百万个素数在不久的将来不太可能改变:-)

换句话说,用类似的东西创建你的筛子:

unsigned char primeTbl[] = {0,0,1,1,0,1,0,1,0,0,0,1};
#define isPrime(x) ((x < sizeof(primeTbl) ? primeTbl[x] : isPrimeFn(x))

所有关于不要传递诸如此类的常见警告a++进入宏。这为您提供了两全其美的功能,即对“小”素数进行极其快速的表查找,对于范围之外的素数则返回到计算方法。

显然,您将使用其他方法之一编写一个程序来生成该查找表 - 您真的不想手动输入所有内容。

但是,与所有优化问题一样,测量,不要猜测!


*a A classic case of this was some trig functions I once had to write for an embedded system. This was a competitive contract bid and the system had a little more storage than CPU grunt.

我们实际上赢得了合同,因为我们的功能基准数据击败了竞争对手。

为什么?因为我们预先将这些值计算到最初在另一台机器上计算的查找表中。通过明智地使用归约(将输入值降低到 90 度以下)和三角属性(余弦只是正弦的相移,并且其他三个象限与第一个象限相关),我们将查找表简化为180 个条目(每半度一个)。

最好的解决方案是那些优雅的and狡猾的:-)


不管怎样,下面的 C 代码将为您生成这样一个表,其中包含 400 万以下的所有素数(其中 283,000 个)。

#include <stdio.h>

static unsigned char primeTbl[4000000];

int main (void) {
    int i, j;

    for (i = 0; i < sizeof(primeTbl); i++)
        primeTbl[i] = 1;

    primeTbl[0] = 0;
    primeTbl[1] = 0;
    for (i = 2; i < sizeof(primeTbl); i++)
        if (primeTbl[i])
            for (j = i + i; j < sizeof(primeTbl); j += i)
                primeTbl[j] = 0;

    printf ("static unsigned char primeTbl[] = {");
    for (i = 0; i < sizeof(primeTbl); i++) {
        if ((i % 50) == 0) {
            printf ("\n   ");
        }
        printf ("%d,", primeTbl[i]);
    }
    printf ("\n};\n");
    printf ("#define isPrime(x) "
        "((x < sizeof(primeTbl) ? primeTbl[x] : isPrimeFn(x))\n");

    return 0;
}

如果你能提高primeTbl如果将表添加到 1600 万个条目 (16M),您会发现这足以将素数计数保持在 100 万以上(前 1,031,130 个素数)。

现在有一些方法可以减少存储空间,例如仅存储奇数并调整宏来解决这个问题,或者使用位掩码而不是无符号字符。如果内存可用的话,我自己更喜欢算法的简单性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对小数的最快素数测试 的相关文章

  • 超级丑陋的数字

    所以问题是 编写一个程序来查找第 n 个超级丑数 超级丑数是正数 其所有素数因子都在给定素数列表中 大小为 k 的素数 例如 1 2 4 7 8 13 14 16 19 26 28 32 是给定素数的前 12 个超级丑数的序列 2 7 13
  • 从数组中打印素数

    我想用方法从数组中打印出所有素数 我可以用一个 int 来完成 但不知道如何从数组中返回某些数字 感谢帮助 public static boolean isPrime int tab boolean prime true for int i
  • 判断一个数是否是质数

    我已经仔细阅读了有关该主题的大量代码 但大多数代码生成的数字一直到输入数字都是素数 但是 我需要的代码仅检查给定的输入数字是否为素数 这是我能够写的 但它不起作用 void primenumber int number if number
  • 根据具体数据计算锯齿波和三角波

    我需要计算三角形和锯齿波 但由于我的模型和我能够使用的数据 它有点复杂 但也许我只是感到困惑 我能够计算我的正弦波 但我并没有真正使用帧计数器 我所做的是 计算theta increment下次需要计算样本时可以使用的变量 这工作起来是这样
  • 为什么在比较范围内的数字时会在汇编代码中发生分支?

    我正在读书this https stackoverflow com questions 17095324 fastest way in c to determine if an integer is between two integers
  • 在等式约束的情况下求解线性规划

    我问了一个问题 可以在这里找到 计算最优组合 https stackoverflow com questions 17232596 computing the optimal combination 并有人建议线性规划 我查阅了线性规划和单
  • 检查一个数字是否可以表示为两个立方之和的高效程序

    我正在尝试编写一个程序来检查数字 N 是否可以表示为两个立方之和 即 N a 3 b 3 这是我的代码 复杂度为 O n include
  • 如何将一个数表示为4个素数之和?

    这是问题所在 四个素数的和 http acm uva es p v101 10168 html 指出 输入的每一行包含一个整数 N N 输入示例 24 36 46 示例输出 3 11 3 73 7 13 1311 11 17 7 我第一眼就
  • 是否有一个函数 f(n) 返回有序组合列表中的第 n: 个组合而不重复?

    当要选择的元素数 n 为 5 并且选择的元素数 r 为 3 时 没有重复的组合如下所示 0 1 2 0 1 3 0 1 4 0 2 3 0 2 4 0 3 4 1 2 3 1 2 4 1 3 4 2 3 4 随着 n 和 r 的增长 组合的
  • 求分数 a/b 的小数点后第 k 位,其中 a、b、k 是非常大的整数(小于 10e18)

    我的任务是找到分数 a b 小数点后第 k 位的数字 昨天我发现了这个算法 为了获取小数点后的任何数字 我生成一个名为 rem 的变量并进行循环 for int i 1 i lt k 1 i rem a b a rem 10 cout lt
  • 如何创建一个在给定范围内随机打乱数字的 int 数组[重复]

    这个问题在这里已经有答案了 基本上 假设我有一个可以容纳 10 个数字的 int 数组 这意味着我可以在每个索引中存储 0 9 每个数字只能存储一次 如果我运行下面的代码 int num new int 10 for int i 0 i l
  • 求反射角的弧度

    我正在编写一个简单的 Flash 游戏 只是为了学习 Flash 并提高我的数学能力 但我对弧度感到非常困惑 因为这对我来说是新的 到目前为止 我所做的是使用鼠标 单击并释放 使用弧度向该方向射出一个球 现在我想要发生的是 当球撞到墙壁时
  • Android:如何获取小数点后的两位数?不想截断值

    如何获取小数点后仅两位数的双精度值 例如 如果 a 190253 80846153846 那么结果值应该像 a 190253 80 尝试 我尝试过这个 public static DecimalFormat twoDForm new Dec
  • C/C++ 中的最小二乘回归

    如何在 C C 中实现因子分析的最小二乘回归 the黄金标准是LAPACK http www netlib org lapack lug node27 html 你特别想要xGELS
  • LibGDX - 正确使用 Polygon 类

    我创造了Polygon包裹我的飞机的物体 飞机的大小TextureRegion是 256x74 但在游戏中这个尺寸是 70x20 所以 TextureRegion texRegsAirplane TextureRegion split te
  • 为什么在 Javascript 中添加两位小数会产生错误的结果? [复制]

    这个问题在这里已经有答案了 可能的重复 JavaScript 的数学有问题吗 https stackoverflow com questions 588004 is javascripts math broken 为什么 JS 搞砸了这个简
  • 优雅的折线“左移”测试

    Given X Y 坐标 即车辆的位置 X Y 数组 它们是折线中的顶点 请注意 折线仅由直线段组成 没有圆弧 我想要的是 计算车辆是在折线的左侧还是右侧 当然还是在顶部 我的做法 迭代所有线段 并计算到每个线段的距离 然后 对于最近的段
  • Python:球体的交集

    我对编程非常陌生 但我决定承担一个有趣的项目 因为我最近学会了如何以参数形式表示球体 当三个球体相交时 有两个不同的交点 除非它们仅在一个奇点处重叠 球体的参数表示 我的代码是根据答案修改的Python matplotlib 绘制 3d 立
  • 给定与总和匹配的长度的唯一 3 位数字 (-1,0,1) 序列的数量

    假设您有一个长度为 n 即空格数 的垂直游戏板 你有一个三面骰子 有以下选项 前进一 停留和后退 如果您低于或高于棋盘游戏空间的数量 则该游戏无效 一旦到达棋盘末端 唯一有效的动作就是 停留 给定确切的骰子投掷次数 t 是否可以通过算法计算
  • 四舍五入到 25、50、75、100

    我不是一个数学爱好者 所以我很难想出一个将小数四舍五入到 25 50 75 和 100 的计算方法 这不会是典型的四舍五入 因为小数不会减少但只增加了 Example 如果 11 12 则舍入为 11 25 如果为 11 34 则舍入为 1

随机推荐

  • 类似于 std::integral_constant 但在 std C++20 库中具有自动模板参数?

    从C 20开始可以使用auto实现积分常量的模板参数 在线尝试一下 https godbolt org z 3dfq7bbP1 template
  • 使用 StackLayout 进行标签换行

    我正在使用 Xamarin 并使用 XAML 创建视图 但我一生都无法让这个标签按照我想要的方式包装 如果标签到达屏幕边缘 我希望它像这样换行 现在它看起来像这样 这是我的代码
  • 使用 Python 导出 Tensorflow 网络并在不使用 Bazel 的情况下使用 C++ 导入

    使用 TensorFlow 我尝试在 C 文件中加载我在 Python 中训练的网络 我正在保存带有输入张量的网络x和输出张量y在 Python 上 with tf Session graph tf Graph as sess tf sav
  • facebook opengraph 中的推断属性是什么意思 [重复]

    这个问题在这里已经有答案了 可能的重复 在对象调试器中得到错误的 ogtype https stackoverflow com questions 9953779 get wrong ogtype in object debugger 我有
  • 从角度服务通过管道传输时,rxjs catchError 不起作用

    使用 redux 和 Angular 我有以下效果 Effect public authenticate Observable
  • 如何分割字节数组

    我在内存中有一个字节数组 从文件中读取 我想在某个点 索引 分割字节数组 而不必只创建一个新的字节数组并一次复制每个字节 从而增加操作的内存占用 我想要的是这样的 byte largeBytes 1 2 3 4 5 6 7 8 9 byte
  • 如何使用DialogFragment和FragmentManager制作DatePicker?

    所以我已经在这个问题上有一段时间了 但我似乎无法弄清楚 我对 Android 开发还很陌生 所以请耐心等待 我对创建日期选择器不太熟悉 我学会了以不推荐使用的方式来完成它 只是为了掌握它的窍门 使用本教程来帮助我加快速度 http deve
  • 使用 CLI 时如何将 Java 类添加到 Worklight 适配器

    我正在尝试将 Java 类添加到我的适配器 如教程中所述在适配器中使用 Java http public dhe ibm com software mobile solutions worklight docs v620 04 12 Usi
  • 当鼠标悬停在放置目标上时如何更改拖放光标

    我有一个应用程序 其中包含一个取消归档 文件属性 文件的放置目标 我想将表单的 DragEnter 事件中的鼠标光标更改为我作为嵌入资源的自定义光标 cur 放置目标是带有目标图像的透明形式 整个表格是放置目标 我知道当我控制拖动源时可以使
  • 通过 AJAX 将动态字段添加到嵌套表单

    我一直在我的应用程序上观看和重现这些轨道广播 196 嵌套模型表单第 1 部分 http railscasts com episodes 196 nested model form part 1 and 197 嵌套模型形式 第 2 部分
  • 如何在 R 中堆叠数据框[重复]

    这个问题在这里已经有答案了 我有一个数据框 我想将其堆叠在 R 中 这样我最终会得到三列 下面是当前格式的一些示例数据 gt dput df structure list Day c d1 d2 d3 d4 d5 d6 d7 d8 d9 d
  • 使用 Java 代理将类添加到类路径

    我正在使用 Java Agent 和 Javassist 向某些 JDK 类添加一些日志记录 本质上 当系统加载一些 TLS 类时 Javassist 会向它们添加一些额外的字节码 以帮助我调试一些连接问题 考虑到此类包含在代理 jar 中
  • “poly()”如何生成正交多项式?如何理解返回的“coefs”?

    我对正交多项式的理解是它们采用以下形式 y x a1 a2 x c1 a3 x c2 x c3 a4 x c4 x c5 x c6 最多达到所需的术语数 where a1 a2 etc是每个正交项的系数 拟合之间有所不同 并且c1 c2 e
  • vim - 从 vim 撤消文件恢复丢失的文件

    我不小心删除了 vimrc 这花了我几周的时间来配置 我仍然保留撤消文件 我认为这是恢复它的唯一方法 不幸的是 vim 现在不允许我撤消 我猜是因为我当前的 vimrc 版本无法使用最后一个撤消步骤 修补 另外 vim 撤消文件是经过编码的
  • 如何在最后一个单元格上启动 UITableView?

    在Apple的消息应用程序中 当您单击通讯员的姓名并切换到对话的表格视图 每条消息都有气球 时 表格会一直滚动到最后 没有动画或任何东西 它就在那里 同样 在 Tweetie 2 中 当您加载推文视图时 它会出现在您上次查看的位置 没有动画
  • 检查列表是否包含类型?

    检查列表中是否存在某种类型的最快方法是什么 我希望我能做到以下几点 class Generic object def class SubclassOne Generic def class SubclassOne Generic def t
  • 如何处理 MVC 中的页面流(特别是 asp.net)

    如果您必须在 mvc 中提供类似于表单输入体验的向导 您将如何抽象页面流 研究重定向后获取模式 http weblogs asp net mhawley archive tags MVC default aspx http weblogs
  • sql 按日期分组,不带时间

    我是 sql 新手 我想创建一个查询来计算我每天的所有文章 ID 但问题是日期列也包含时间 那么我如何才能使查询仅按日期分组而无需时间 例如 id article id date timestamp 1 22 2014 01 10 13 3
  • GIT 不跟踪文件

    我已经在 AIX 6 1 上设置了 GIT 但遇到了问题 我遵循的步骤顺序如下所示 我创建一个文件夹 进入文件夹并初始化非裸存储库 初始化用户名和用户电子邮件 创建一个名为index html 的文件 并在该文件中包含一些数据 创建一个名为
  • 对小数的最快素数测试

    我在业余时间玩了 Euler 项目 现在我需要做一些重构 我已经实施了 Miller Rabin 以及一些筛子 我以前听说过 对于较小的数量 例如数百万以下 筛子实际上更快 有人有这方面的信息吗 谷歌并没有多大帮助 Yes you ll f