C#判断素数的方法:试除法 vs 优化的试除法 vs 米勒-拉宾素数检测算法

目录

1.素数也就质数

2. 试除法

3.优化的试除法_1

4.优化的试除法_2

5.优化的试除法_3

6.米勒-拉宾素数检测算法


1.素数也叫质数

        一个质数是一个大于1的自然数,只有两个正因数:1和它自身。这意味着如果一个数只有两个正因数,那么它就是一个质数。例如,2、3、5、7、11和13都是质数。
        质数在数学和密码学中非常重要,因为它们具有一些独特的属性。例如,质数的乘积也是质数,如果一个数是两个质数的乘积,则这个数是质因数分解的唯一方式。这使得质数在密码学中非常有用,特别是在公钥加密中,例如RSA算法。
        在编程中,可以使用不同的算法来检查一个数是否为质数,例如试除法、米勒-拉宾素性测试或AKS素性测试。

2. 试除法

        试除法算法用于检查一个数字是否为质数。它通过尝试将2到a/2之间的所有数字除以a,并检查余数是否为0来工作。如果找到任何可以将a整除的数字,该函数返回false,表明a不是质数。如果在2到a/2之间的任何数字都不能将a整除,则该函数返回true,表明a是质数。
        该算法不是特别高效,因为它检查了a的所有数字除数,但适用于小型数字。对于大型数字,更高效的算法,如米勒-拉宾素性测试或AKS素性测试,可能更合适。

//试除法判断素数
namespace _140_2
{public partial class Form1 : Form{private GroupBox? groupBox1;private TextBox? textBox1;private Label? label1;private Button? button1;private Label? label2;public Form1(){InitializeComponent();StartPosition = FormStartPosition.CenterScreen;Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){// // textBox1// textBox1 = new TextBox{Location = new Point(84, 33),Name = "textBox1",Size = new Size(100, 23),TabIndex = 1};// // label1// label1 = new Label{AutoSize = true,Location = new Point(18, 36),Name = "label1",Size = new Size(68, 17),TabIndex = 0,Text = "输入数字:"};// // groupBox1// groupBox1 = new GroupBox{Location = new Point(12, 12),Name = "groupBox1",Size = new Size(200, 85),TabIndex = 0,TabStop = false,Text = "判断素数"};groupBox1.Controls.Add(textBox1);groupBox1.Controls.Add(label1);groupBox1.SuspendLayout();// // button1// button1 = new Button{Location = new Point(121, 103),Name = "button1",Size = new Size(75, 23),TabIndex = 2,Text = "判断",UseVisualStyleBackColor = true};button1.Click += Button1_Click;// // label2// label2 = new Label{AutoSize = true,Location = new Point(30, 109),Name = "label2",Size = new Size(43, 17),TabIndex = 3,Text = "label2"};// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(224, 136);Controls.Add(label2);Controls.Add(button1);Controls.Add(groupBox1);Name = "Form1";Text = "判断是否素数";groupBox1.ResumeLayout(false);groupBox1.PerformLayout();}private void Button1_Click(object? sender, EventArgs e){int j = Convert.ToInt32(textBox1!.Text);if (Prime(j) == true){label2!.Text = "是素数";}else{label2!.Text = "不是素数";}}/// <summary>/// 试除法判断素数/// </summary>static bool Prime(int a){int i;if (a == 2)return true;//else if (a == 4) { return false; }//如果使用上面这条语句,那么for循环条件用<;//如果不用上面这条语句,那么for循环条件用<=;//区别在于循环数量多一次else{for (i = 2; i <= a / 2; i++){if (a % i == 0)return false;}return true;}}}
}

 

3.优化的试除法_1

        步骤2里的试除法将2到a/2之间的所有数字除以a。优化的试除法_1首先检查a是否为2,因为2是唯一的偶数质数。然后,如果a为1或偶数,该算法返回false,因为1和所有偶数(除了2)都不是质数。最后,如果a为奇数,则该算法执行试除法,仅检查3到a的平方根之间的奇数是否可以将a整除。这比原始算法更有效,因为它避免了检查2到a/2之间的所有数字。

//优化的试除法判断素数
namespace _140_1
{public partial class Form1 : Form{private GroupBox? groupBox1;private TextBox? textBox1;private Label? label1;private Button? button1;private Label? label2;public Form1(){InitializeComponent();StartPosition = FormStartPosition.CenterScreen;Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){// // textBox1// textBox1 = new TextBox{Location = new Point(84, 33),Name = "textBox1",Size = new Size(100, 23),TabIndex = 1};// // label1// label1 = new Label{AutoSize = true,Location = new Point(18, 36),Name = "label1",Size = new Size(68, 17),TabIndex = 0,Text = "输入数字:"};// // groupBox1// groupBox1 = new GroupBox{Location = new Point(12, 12),Name = "groupBox1",Size = new Size(200, 85),TabIndex = 0,TabStop = false,Text = "判断素数"};groupBox1.Controls.Add(textBox1);groupBox1.Controls.Add(label1);groupBox1.SuspendLayout();// // button1// button1 = new Button{Location = new Point(121, 103),Name = "button1",Size = new Size(75, 23),TabIndex = 2,Text = "判断",UseVisualStyleBackColor = true};button1.Click += Button1_Click;// // label2// label2 = new Label{AutoSize = true,Location = new Point(30, 109),Name = "label2",Size = new Size(43, 17),TabIndex = 3,Text = "label2"};// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(224, 136);Controls.Add(label2);Controls.Add(button1);Controls.Add(groupBox1);Name = "Form1";Text = "判断是否素数";groupBox1.ResumeLayout(false);groupBox1.PerformLayout();}private void Button1_Click(object? sender, EventArgs e){int j = Convert.ToInt32(textBox1!.Text);if (Prime(j) == true){label2!.Text = "是素数";}else{label2!.Text = "不是素数";}}/// <summary>/// 优化的试除法判断素数/// </summary>static bool Prime(int a){int i;if (a == 2)return true;else if (a == 1 || a % 2 == 0)return false;else{for (i = 3; i * i <= a; i += 2){if (a % i == 0)return false;}return true;}}}
}

 

4.优化的试除法_2

        步骤2里的试除法将2到a/2之间的所有数字除以a。优化的试除法_1在2到a/2的范围内筛除偶数。

        优化的试除法_2是通过遍历从2到这个数的平方根之间的所有整数,检查这个数是否可以被这些整数整除。如果可以被任何一个整数整除,那么这个数就不是素数。否则,这个数就是素数。

//优化的试除法_2判断素数
namespace _140_3
{public partial class Form1 : Form{private GroupBox? groupBox1;private TextBox? textBox1;private Label? label1;private Button? button1;private Label? label2;public Form1(){InitializeComponent();StartPosition = FormStartPosition.CenterScreen;Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){// // textBox1// textBox1 = new TextBox{Location = new Point(84, 33),Name = "textBox1",Size = new Size(100, 23),TabIndex = 1};// // label1// label1 = new Label{AutoSize = true,Location = new Point(18, 36),Name = "label1",Size = new Size(68, 17),TabIndex = 0,Text = "输入数字:"};// // groupBox1// groupBox1 = new GroupBox{Location = new Point(12, 12),Name = "groupBox1",Size = new Size(200, 85),TabIndex = 0,TabStop = false,Text = "判断素数"};groupBox1.Controls.Add(textBox1);groupBox1.Controls.Add(label1);groupBox1.SuspendLayout();// // button1// button1 = new Button{Location = new Point(121, 103),Name = "button1",Size = new Size(75, 23),TabIndex = 2,Text = "判断",UseVisualStyleBackColor = true};button1.Click += Button1_Click;// // label2// label2 = new Label{AutoSize = true,Location = new Point(30, 109),Name = "label2",Size = new Size(43, 17),TabIndex = 3,Text = "label2"};// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(224, 136);Controls.Add(label2);Controls.Add(button1);Controls.Add(groupBox1);Name = "Form1";Text = "判断是否素数";groupBox1.ResumeLayout(false);groupBox1.PerformLayout();}private void Button1_Click(object? sender, EventArgs e){int j = Convert.ToInt32(textBox1!.Text);if (Prime(j) == true){label2!.Text = "是素数";}else{label2!.Text = "不是素数";}}/// <summary>/// 优化的试除法判断素数/// </summary>public static bool Prime(int number){if (number <= 1){return false;}for (int i = 2; i <= Math.Sqrt(number); i++){if (number % i == 0){return false;}}return true;}}
}

 

5.优化的试除法_3

         步骤2里的试除法将2到a/2之间的所有数字除以a。优化的试除法_1在2到a/2的范围内筛除偶数。优化的试除法_2是通过遍历从2到这个数的平方根之间的所有整数。

        优化的试除法_3只检查从2到这个数的平方根之间的奇数是否可以整除这个数。因为任何大于1的自然数都可以表示为2的幂次方乘以一个奇数,所以只需要检查奇数是否可以整除这个数,这样可以减少一半的检查次数。

//优化的试除法_3判断素数
namespace _140_4
{public partial class Form1 : Form{private GroupBox? groupBox1;private TextBox? textBox1;private Label? label1;private Button? button1;private Label? label2;public Form1(){InitializeComponent();StartPosition = FormStartPosition.CenterScreen;Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){// // textBox1// textBox1 = new TextBox{Location = new Point(84, 33),Name = "textBox1",Size = new Size(100, 23),TabIndex = 1};// // label1// label1 = new Label{AutoSize = true,Location = new Point(18, 36),Name = "label1",Size = new Size(68, 17),TabIndex = 0,Text = "输入数字:"};// // groupBox1// groupBox1 = new GroupBox{Location = new Point(12, 12),Name = "groupBox1",Size = new Size(200, 85),TabIndex = 0,TabStop = false,Text = "判断素数"};groupBox1.Controls.Add(textBox1);groupBox1.Controls.Add(label1);groupBox1.SuspendLayout();// // button1// button1 = new Button{Location = new Point(121, 103),Name = "button1",Size = new Size(75, 23),TabIndex = 2,Text = "判断",UseVisualStyleBackColor = true};button1.Click += Button1_Click;// // label2// label2 = new Label{AutoSize = true,Location = new Point(30, 109),Name = "label2",Size = new Size(43, 17),TabIndex = 3,Text = "label2"};// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(224, 136);Controls.Add(label2);Controls.Add(button1);Controls.Add(groupBox1);Name = "Form1";Text = "判断是否素数";groupBox1.ResumeLayout(false);groupBox1.PerformLayout();}private void Button1_Click(object? sender, EventArgs e){int j = Convert.ToInt32(textBox1!.Text);if (Prime(j) == true){label2!.Text = "是素数";}else{label2!.Text = "不是素数";}}/// <summary>/// 优化的试除法判断素数/// </summary>public static bool Prime(int number){if (number <= 1){return false;}for (int i = 2; i <= Math.Floor(Math.Sqrt(number)); i += 2){if (number % i == 0){return false;}}for (int i = 3; i <= Math.Floor(Math.Sqrt(number)); i += 2){for (int j = i * i; j <= number; j += i){if (number % j == 0){return false;}}}return true;}}
}

 

6.米勒-拉宾素数检测算法

        使用更高级的算法,如米勒-拉宾素数检测算法(Miller-Rabin Primality Test),这是一种概率算法,通过反复应用费马小定理来判断一个数是否为素数。

// 米勒-拉宾素数检测算法(Miller-Rabin Primality Test)判断素数
using System.Numerics;namespace _140_5
{public partial class Form1 : Form{private GroupBox? groupBox1;private TextBox? textBox1;private Label? label1;private Button? button1;private Label? label2;public Form1(){InitializeComponent();StartPosition = FormStartPosition.CenterScreen;Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){// // textBox1// textBox1 = new TextBox{Location = new Point(84, 33),Name = "textBox1",Size = new Size(100, 23),TabIndex = 1};// // label1// label1 = new Label{AutoSize = true,Location = new Point(18, 36),Name = "label1",Size = new Size(68, 17),TabIndex = 0,Text = "输入数字:"};// // groupBox1// groupBox1 = new GroupBox{Location = new Point(12, 12),Name = "groupBox1",Size = new Size(200, 85),TabIndex = 0,TabStop = false,Text = "判断素数"};groupBox1.Controls.Add(textBox1);groupBox1.Controls.Add(label1);groupBox1.SuspendLayout();// // button1// button1 = new Button{Location = new Point(121, 103),Name = "button1",Size = new Size(75, 23),TabIndex = 2,Text = "判断",UseVisualStyleBackColor = true};button1.Click += Button1_Click;// // label2// label2 = new Label{AutoSize = true,Location = new Point(30, 109),Name = "label2",Size = new Size(43, 17),TabIndex = 3,Text = "label2"};// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(224, 136);Controls.Add(label2);Controls.Add(button1);Controls.Add(groupBox1);Name = "Form1";Text = "判断是否素数";groupBox1.ResumeLayout(false);groupBox1.PerformLayout();}private void Button1_Click(object? sender, EventArgs e){int j = Convert.ToInt32(textBox1!.Text);if (Prime(j) == true){label2!.Text = "是素数";}else{label2!.Text = "不是素数";}}/// <summary>/// 米勒-拉宾素数检测算法(Miller-Rabin Primality Test)判断素数/// </summary>public static bool Prime(int number){if (number <= 1){return false;}if (number == 2 || number == 3){return true;}if (number % 2 == 0){return false;}int s = 0;int d = number - 1;while (d % 2 == 0){s++;d /= 2;}Random rand = new();int a = rand.Next(2, number - 1);BigInteger x = BigInteger.ModPow(a, d, number);if (x == 1 || x == number - 1){return true;}for (int i = 0; i < s; i++){x = BigInteger.ModPow(x, 2, number);if (x == number - 1){return true;}}return false;}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#QT(QSpinBox,QDoubleSpinBox)

1.IDE&#xff1a;QTCreator 2.实验:实现一个计价工具&#xff0c;进制转换工具。 教程来自&#xff1a;阿西拜编程 QT C 5.9 3.记录 设置进制的第二种方法 ui->hex_tx->setDisplayIntegerBase(16); //设置显示进制为16进制 4.代码 widget.cpp #include "wi…

做一下笔记 CXDB5CCAM-MK 与 CXDBCCAM-ML 的区别

1. CXDB5CCAM-MK 的简介 2. CXDBCCAM-ML 的简介 3. 这个两个器件的区别 最基本可见的区别是 &#xff1a; 传输速度的不同。 4. 资料在资源里面

智能计算的基本原理——智能计算原理与实践【文末送书-36】

文章目录 智能计算的基本原理基本原理技术智能计算在实践中的应用 智能计算&#xff1a;原理与实践【文末送书-36】 随着科技的不断发展&#xff0c;智能计算成为引领时代的前沿技术之一。从传统的计算机模型到如今的人工智能系统&#xff0c;智能计算不仅深刻地改变着我们的生…

Python学习:首选开发环境VScode

Visual Studio Code 打开官网 https://code.visualstudio.com/&#xff0c;下载软件包&#xff0c;一步步安装即可。 我认为Visual Studio Code最好的Web前端开发工具。 Visual Studio Code是什么 Visual Studio Code (简称 VS Code) 是一款由 Microsoft 开发的轻量级、免费和…

深入探究:AVL树的平衡之道

文章目录 一、AVL树的原理AVL树的定义和特性平衡因子的概念 二、AVL树的自平衡策略a. 单旋&#xff08;single rotation&#xff09;1. 左单旋&#xff08;Left Rotation&#xff09;&#xff1a;2. 右单旋&#xff08;Right Rotation&#xff09;&#xff1a; b. 双旋&#xf…

低功耗DC-DC电压调整器IU5528D

IU5528D是一款超微小型,超低功耗,高效率,升降压一体DC-DC调整器。适用于双节,三节干电池或者单节锂电池的应用场景。可以有效的延长电池的使用时间。IU5528D由电流模PWM控制环路&#xff0c;误差放大器&#xff0c;比较器和功率开关等模块组成。该芯片可在较宽负载范围内高效稳…

自学软件测试真的能找到工作吗?“我“的测试之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自学软件测试当然…

【C++】C++学习前言

C前言与发展 一.什么是C二.C的发展史三.C的重要性 一.什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20世纪…

猫生骨肉冻干价格合理区间是多少?真正性价比高的生骨肉冻干推荐

随着养猫知识的普及&#xff0c;生骨肉冻干喂养受到越来越多铲屎官的欢迎。然而&#xff0c;价格因素仍是部分铲屎官的阻碍。实际上&#xff0c;像我这样的资深铲屎官&#xff0c;早已认识到生骨肉冻干的价值。虽然生骨肉冻干的价格相对于烘焙粮和膨化粮要高一些&#xff0c;但…

前端之用HTML做一个汇款单

例子 代码 里面注释是我我对运用到的知识的理解 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>工商银行电子汇款单</title> </head> <body><h3>工商银行电子汇款单</…

面试题02.07.链表相交

方法一&#xff1a;暴力 public ListNode getIntersectionNode(ListNode headA, ListNode headB) {//先获得链表长度ListNode l1 headA;ListNode l2 headB;int m 0, n 0;while(l1 ! null){m;l1 l1.next;}while(l2 ! null){n;l2 l2.next;}ListNode l3 headA;for(int i …

什么是Redis的数据分片?

Redis的数据分片(sharding)是一种将一个Redis数据集分割成多个部分&#xff0c;分别存诸在不同的Redis节点上的技术。它可以用于将一个单独的Redis数据库扩展到多个物理机器上&#xff0c;从而提高Redis集群的性能和可扩展性 Redis数据分片的实现方式通常是将数据按照某种规则(…

独家直播!手机无人APP,让你跟上最新潮流

手机无人APP&#xff0c;是一款极具创新力和前瞻性的应用&#xff0c;旨在让用户随时随地跟上最新潮流。通过独家直播功能&#xff0c;用户可以第一时间了解世界各地的潮流资讯&#xff0c;与时俱进&#xff0c;展现出自己的个性和风采。 无人APP的直播功能实现了信息的即时传…

工业涂装行业的物联网解决方案

工业涂装行业的物联网解决方案 工业涂装行业在制造业中占据重要地位&#xff0c;其产品质量直接影响到最终产品的外观和性能。然而&#xff0c;传统涂装生产线容易出现质量问题&#xff0c;如色差、光泽度不均、橘皮现象等。为了解决这些问题&#xff0c;工业涂装行业需要寻求…

String 底层为什么使用 final 修饰?

1、典型回答 对于这个问题&#xff0c;Java之父詹姆斯 高斯林&#xff08;James Gosling&#xff09; 是这样回答的&#xff1a; I would use an immutable whenever I can 翻译为中文&#xff1a;只要允许&#xff0c;我就会使用不可变对象 而作为普通人的我们来说&#xff0…

算法---双指针练习-8(四数之和)

四数之和 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;四数之和 2. 讲解算法原理 首先对输入的数组进行排序&#xff0c;以便后续使用双指针法。初始化一个空的二维向量 ret&#xff0c;用于存储结果。对数组中的每个元素 nums[i] 进行遍历&#…

mysql主键和外键的区别

mysql主键和外键的区别 一、主键与外键存在的意义 主键和外键在关系数据库中扮演着至关重要的角色&#xff0c;它们共同维护着数据的完整性和一致性。 主键&#xff1a;它是每条记录的唯一标识符&#xff0c;犹如人的身份证号码&#xff0c;具有唯一性和非空性。例如&#x…

Linux基础命令[15]-less

文章目录 1. less 命令说明2. less 命令语法3. less 命令示例3.1 不加参数3.2 -N&#xff08;显示行号&#xff09;3.3 打开多个文件3.4 标记导航3.5 搜索内容 4. 总结 1. less 命令说明 less&#xff1a;用来分页查看文件&#xff0c;与 more 相比更加的灵活&#xff0c;并且…

算法之二分查找算法

二分查找算法简介 1. 首先说明二分查找算法是比较恶心, 细节很多, 很容易写出死循环的算法, 但熟悉了之后是最简单的算法. 2. 其次我们可能听说过二分查找的前提是数组有序的前提下进行, 但其实不一定. 3. 二分查找算法有一套模板: 朴素的二分模板: 比较简单, 但是有局限性查找…

docker——启动各种服务

1.Mysql 2.Redis 3.nginx 4.ES 注意&#xff1a;ES7之后环境为 -e ELASTICSEARCH_HOSTS http://ip地址:9200