你是质数吗

2024-01-09

多年来我一直对寻找更好的素数识别器的问题感兴趣。我意识到这是一个巨大的学术研究领域——我对此的兴趣实际上只是为了好玩。这是我在 C 语言中第一次尝试可能的解决方案(如下)。

我的问题是,你能提出改进建议吗(没有引用网上的其他参考资料,我正在寻找实际的 C 代码)?我试图从中得到的是更好地理解确定此类解决方案的性能复杂性。

我认为这个解决方案的复杂度是 O(n^2) 的结论正确吗?

#include <stdio.h>
#include <math.h>

/* isprime                                                           */
/* Test if each number in the list from stdin is prime.              */
/* Output will only print the prime numbers in the list.             */

int main(int argc, char* argv[]) {

    int returnValue = 0;
    int i;
    int ceiling;
    int input = 0;
    int factorFound = 0;

    while (scanf("%d", &input) != EOF) {

        ceiling = (int)sqrt(input);
        if (input == 1) {
            factorFound = 1;
        }

        for (i = 2; i <= ceiling; i++) {
            if (input % i == 0) {
                factorFound = 1;
            } 
        }

        if (factorFound == 0) {
            printf("%d\n", input);
        }

        factorFound = 0;    
    } 

    return returnValue;
}

   for (i = 2; i <= ceiling; i++) {
        if (input % i == 0) {
            factorFound = 1;
            break;
        } 
    }

这是第一个改进,并且仍然保持在“相同”算法的范围内。根本不需要任何数学知识就能看到这一点。

除此之外,一旦你看到了input不能被2整除,则无需检查4、6、8等。如果有偶数被整除input,那么 2 肯定会有,因为它能整除所有偶数。

如果你想稍微跳出算法一步,你可以使用像下面这样的循环:谢尔顿·L·库珀 https://stackoverflow.com/questions/3793697/are-you-a-prime-number/3793790#3793790在他的回答中提供了。 (这比让他从评论中纠正我的代码更容易,尽管他的努力非常值得赞赏)

这利用了除 2 和 3 之外的每个素数都具有以下形式的事实n*6 + 1 or n*6 - 1对于某个正整数n。要看到这一点,只需注意如果m = n*6 + 2 or m = n*6 + 4, then n能被 2 整除。如果m = n*6 + 3那么它可以被 3 整除。

事实上,我们可以更进一步。如果p1, p2, .., pk是第一个k素数,那么所有与其乘积互质的整数都标记出所有剩余素数必须适合的“槽”。

看到这个,只需让k#是所有素数的乘积pk。那么如果gcd(k#, m) = g, g划分n*k# + m所以这个总和是微不足道的复合如果g != 1。所以如果你想迭代5# = 30,那么你的互质整数是 1, 7, 11, 13, 17, 19, 23 和 29。


从技术上讲,我没有证明我最后的主张。并没有更困难

if g = gcd(k#, m),那么对于任意整数,n, g划分n*k# + m因为它划分k#所以它也必须除n*k#。但它划分m同样,它必须除以总和。上面我只是证明了n = 1。我的错。


另外,我应该指出,这些都没有改变算法的基本复杂性,它仍然是 O(n^1/2)。它所做的只是彻底地减少用于计算实际预期运行时间的系数。

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

你是质数吗 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • 按接收顺序处理 WebSockets 消息

    我的应用程序的客户端部分需要严格按顺序处理 WebSocket 消息 不幸的是 每条消息的处理时间都相当长 大约 3 秒 因此在第一条消息结束之前会出现另一条消息 几条消息之后 顺序就完全不同了 如何在 JavaScript 中解决这个问题
  • 静态对象在多个正在运行的应用程序中是同一个对象吗?

    如果您有一个 Windows 服务和一个 Windows 窗体应用程序使用相同的静态对象 那么这两个应用程序中的对象是否相同 换句话说 如果我更新服务中的对象 如果两者同时运行 它也会在表单应用程序中更新吗 它们在不同的进程上运行 因此不共
  • 如何使用 Typescript 在 VueJs 手表中使用 Lodash debounce

    在 VueJS Javascript 中我可以这样做 import debounce from lodash debounce watch variable debounce function console log wow 500 在 V
  • 映射到 Java 8 中的运行总和

    如果我有一个集合 List
  • 如何使用 OpenSSL 创建和信任证书?

    如何使用 OpenSSL 创建有效的证书以在 IIS 中使用 HTTPS 绑定 它必须在 Firefox 和所有其他浏览器中工作 我使用的是 IIS 10 服务器 And Firefox v70 火狐开发者v72b5版本 Chrome v7
  • Qt支持虚拟纯插槽吗?

    我的 GUI 项目在Qt有很多 配置页面 类 它们都直接继承自QWidget 最近 我意识到所有这些类共享 2 个公共槽 loadSettings and saveSettings 对此 我有两个问题 编写一个中间基抽象类是否有意义 让我们
  • 处理来自 wxFrame 上的 wxTextCtrl 的事件 - C++/wxWidgets

    我有一个MyFrame其源自wxFrame A wxTextCtrl被添加到此框架中 我可以处理吗EVT KEY DOWN这个文本控件在框架中的位置 就像是 BEGIN EVENT TABLE wxTextCtrl wxControl EV
  • 如何使用 F# 可区分联合类型作为 TestCase 属性参数?

    我正在尝试测试 F 函数的返回结果是否与预期的可区分联合案例匹配 我正在使用 NUnit 来创建测试 它不喜欢将受歧视的联合类型作为TestCase范围 以下测试用例无法编译
  • 动态AndroidManifest.xml

    是否可以动态定义 AndroidManifest xml 的各个方面 例如 是否可以使用 Java 代码动态注册或编辑活动 服务和接收者的定义 如果是这样 此代码的放置位置是否有任何限制 还有什么可以动态定义的 我相信大多数可用的操作都由包
  • 打印 TCP 数据包数据

    在TCP通信中 当数据包从以太网传输到网络 IP 层时 我想打印该数据包中存在的数据 我正在Linux上工作 我得到一些信息 它可以在 Linux 内核代码的帮助下完成 即在 Linux NAT 防火墙代码中 但是我从哪里可以获得内核源代码
  • Android 使用 include 标签在 ConstraintLayout 中添加其他布局

    我正在使用 ConstraintLayout 制作一个简单的测试应用程序 但我有一个问题 这是我的代码 活动 main xml
  • 错误:“i”的名称查找已更改为 ISO“for”范围 [-fpermissive] [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 问 编写一个程序 发出 您不喜欢的单词 也就是说 您使用 cin 读取单词并在 cout 上再次打印它们 如果某个单词属于您定义的
  • 在unity3d中制作后台线程

    我有 wp7 应用程序有两个后台线程 1 时间规划 2 按计划时间播放不同的声音样本 同一时间可能有几个样本 如何用unity 3d引擎重复这个逻辑 是否可以 Unity 不允许您从主线程以外的任何线程访问其 API 你不能使用锁定原语来绕
  • Conda 包的版本信息与 __version__ 不对应

    我正在使用蟒蛇 myenv3 foo foo which conda home foo anaconda3 bin conda 在 myenv3 中我有dill 2 8 2安装 myenv3 foo foo conda list n mye
  • 更改时将事件附加到属性

    c silverlight 是否有任何功能可以让我在不使用依赖属性的情况下监视用户控件的属性 以了解何时进行任何更改 我想要一个不是静态的 有两种标准机制可以实现 观察 模式 即所描述的模式 一是使用依赖属性 另一个是INotifyProp
  • 如何使用 Intent Extras 传递可序列化对象的数组?

    我想传递一个对象数组而不使用首选项 我用意向 对象类 Bts public class Bts implements Serializable int idbts String nombts String ipaddress String
  • 边框宽度变化时不影响其他元素的定位

    我想在悬停时更改圆圈的边框宽度 而不影响其他元素的位置 会更清楚这个jsFiddle https jsfiddle net xhanrkzy HTML span class menu i class cercle i Foo span sp
  • 未配置 Google 日历 API 访问权限

    我从这里下载了一个示例项目 http code google com p google api java client source browse calendar android sample repo samples http code
  • Arduino 错误:无法将参数 '1' 的 'String' 转换为 'char*' 到 'char* strtok(c​​har*, const char*)'

    我正在研究一个 arduino 分配 它分割传入的字符串并将字符串的术语放入 6 个不同的变量中 分割时的示例输入字符串有 6 个术语 我弹出以下错误 无法将参数 1 的 String 转换为 char 到 char strtok c ha
  • 你是质数吗

    多年来我一直对寻找更好的素数识别器的问题感兴趣 我意识到这是一个巨大的学术研究领域 我对此的兴趣实际上只是为了好玩 这是我在 C 语言中第一次尝试可能的解决方案 如下 我的问题是 你能提出改进建议吗 没有引用网上的其他参考资料 我正在寻找实