使用C# 判断给定大数是否为质数的详解

yizhihongxing

使用C# 判断给定大数是否为质数的详解

判断一个大数是否为质数是一个常见的问题。早期的解决方式是通过试除法,即将该数不断除以比它小的所有正整数,如果在这些正整数中存在约数,那么这个数就不是质数。 但是,这种试除法效率极低,在判断大数时会消耗大量时间和资源。因此,我们需要更快速且高效的方式来判断大数是否为质数。

下面我们将介绍一种使用“Miller-Rabin素性测试算法”的C#代码实现的方法,该算法的效率比试除法高很多。

Miller-Rabin素性测试算法

“Miller-Rabin素性测试算法”是一种使用随机性质的判定质数的方法,能够快速且高效地判断一个数是否为质数。 基本的流程如下:

  1. 将原数n-1分解成2^r * d(d是一个奇数)
  2. 随机选取b[n-1]∈[2, n-2]之间的整数
  3. 求出x=b[n-1]^dmodn,i∈ [0, r-1]
  4. 如果x≠1且x≠n-1并且对于任何0≤j≤r-2,都有x^(2^j)d ≡ -1 mod n,则输出n为合数,退出算法
  5. 如果以上条件都不满足,则重复2—5步

如果重复k次都没有运行到步骤四,那么输出n为素数

C# 代码实现

根据上述算法,我们可以使用以下C#代码来判定大数是否为质数。以下代码中,我们将n=147647、k=5(重复测试的次数)作为示例。

using System;
using System.Numerics;

class Program
{
    static void Main(string[] args)
    {
        //示例: 判断147647是否为质数
        BigInteger n = 147647;
        int k = 5;
        bool res = IsPrime(n, k);
        if(res==true)
        {
            Console.WriteLine(n + " is a prime number.");
        }
        else
        {
            Console.WriteLine(n + " is not a prime number.");
        }
    }

    // Miller-Rabin素性测试算法
    static bool IsPrime(BigInteger n, int k)
    {
        // 基本情况: n = 2或3时,是质数
        if (n == 2 || n == 3)
        {
            return true;
        }

        // 偶数,不是质数
        if (n % 2 == 0)
        {
            return false;
        }

        // 把n-1分解成2^r * d的形式
        BigInteger d = n - 1;
        int r = 0;
        while (d % 2 == 0)
        {
            r++;
            d /= 2;
        }

        // 判断n是不是质数
        Random rand = new Random();
        for (int i = 0; i < k; i++)
        {
            BigInteger a = rand.Next(2, n - 1);
            BigInteger x = BigInteger.ModPow(a, d, n);//求出b[n-1]^d mod n

            if (x == 1 || x == n - 1)
            {
                continue;
            }

            int j;
            for (j = 0; j < r - 1; j++)
            {
                x = BigInteger.ModPow(x, 2, n);//这里直接求x^2 mod n
                if (x == n - 1)
                {
                    break;
                }
            }
            if (j == r - 1)
            {
                return false;
            }
        }
        return true;
    }
}

示例说明

  1. 判断147647是否为质数
BigInteger n = 147647;
int k = 5;
bool res = IsPrime(n, k);

首先,我们将要判断的大数n赋值为147647,然后设定重复测试的次数为k=5。这里设置重复测试的次数越多,判断结果越可靠,但也相应地会消耗更多的时间和资源。

接着,我们使用IsPrime函数对n进行判定,得到判定结果res。如果res为true,那么说明n是质数,否则说明n不是质数。

  1. 判断1000000000000000003是否为质数
BigInteger n = 1000000000000000003;
int k = 5;
bool res = IsPrime(n, k);

接着,我们将要判断的大数n赋值为1000000000000000003,然后设定重复测试的次数为k=5。这里我们测试的数比前一个例子更大。

接着,我们使用IsPrime函数对n进行判定,得到判定结果res。如果res为true,那么说明n是质数,否则说明n不是质数。

总的来说,尽管使用Miller-Rabin算法进行质数判定的效率相较于试除法有了很大的提升,但仍对计算资源要求较高,并且存在概率性问题。但在实际中,它仍是一种非常经典的质数判定算法,可以满足大部分情况的需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用C# 判断给定大数是否为质数的详解 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • c# 实时曲线图示例代码

    下面是详细的“c# 实时曲线图示例代码”攻略。 简介 实时曲线图常用于数据采集与监控领域,其实现方法主要通过定时器事件或者数据缓存方式进行数据刷新。在c#中可以使用WPF或WinForm两种方式实现绘制实时曲线。 在实现实时曲线之前,我们需要掌握以下知识点: 定时器 数据缓存 绘制曲线 实现方法 使用定时器实现 创建WinForm或WPF项目,并添加图表控件…

    C# 2023年6月7日
    00
  • C#中自定义事件和委托实例

    C#中自定义事件和委托实例是一项重要的编程技能。下面是一个完整的攻略,包括理解委托和事件、如何自定义委托和事件、如何订阅和取消订阅事件、如何触发事件等。 理解委托和事件 委托是一种类型,它可以封装一个或多个方法。委托类型的实例可以指向任何具有与其签名匹配的方法。在C#中,委托是如何定义的: delegate void MyDelegate(int arg1,…

    C# 2023年5月31日
    00
  • Winform基于多线程实现每隔1分钟执行一段代码

    实现Winform程序中每隔1分钟执行一段代码需要使用C#中的多线程技术。因为如果直接在UI线程中执行代码可能导致程序响应变慢或者卡死,因此需要单独开辟一个线程来执行这段代码。下面是实现步骤: 1.创建一个定时器对象,用于定时触发执行代码。 private System.Timers.Timer _timer; public MainForm() { Ini…

    C# 2023年6月1日
    00
  • c# 引用Nlog插件的步骤

    下面是关于如何在C#项目中引入NLog插件的详细步骤: 步骤1:安装NLog插件 在Visual Studio中,我们可以使用NuGet包管理器来安装NLog插件。具体步骤如下所示: 打开你的项目,并在菜单栏中选择【工具 (Tools)】 -> 【NuGet包管理器 (NuGet Package Manager)】 -> 【管理解决方案的NuGe…

    C# 2023年5月15日
    00
  • .Net Core日志记录之日志配置

    .NET Core日志记录之日志配置 在.NET Core中,日志记录是一项非常重要的任务,它可以帮助您更好地了解应用程序的运行情况。在本攻略中,我们将详细讲解.NET Core日志记录之日志配置,并提供两个示例说明。 步骤一:添加日志记录提供程序 在.NET Core中,您需要添加日志记录提供程序,以便记录应用程序的日志。以下是添加日志记录提供程序的示例:…

    C# 2023年5月17日
    00
  • 浅谈JsonObject中的key-value数据解析排序问题

    浅谈JsonObject中的key-value数据解析排序问题——攻略 问题描述 在使用JsonObject进行key-value数据解析时,有时我们会发现得到的数据不是按照期望的顺序排列的。这个问题会给我们的主观体验带来很大不便,并且也可能对我们的后续工作造成困扰。所以在这篇文章中,我们将会讨论这个问题的产生原因以及解决方案。 问题产生的原因 当我们使用J…

    C# 2023年6月1日
    00
  • 详解C#App.config和Web.config加密

    C#中的App.config和Web.config文件是应用程序的配置文件,这些配置文件中可能会包含敏感信息,如连接数据库的密码,这些信息一旦泄露将会造成严重的安全问题。因此,对配置文件的加密是必要的。 以下是对C# App.config和Web.config加密的完整攻略: 步骤1:创建加密命令 使用ASP.NET提供的命令工具aspnet_regiis来…

    C# 2023年5月15日
    00
  • C#中list用法实例

    下面是关于C#中List用法的完整攻略。 什么是List 在C#语言中,List是指一个元素列表,也称为动态数组或无限长数组。它允许您动态添加或删除元素,以及在列表中访问特定元素。 如何创建List 我们可以使用List的构造函数来创建List对象。我们可以选择在构造函数中传递有关该List对象的信息,例如其初始容量: // 创建一个新的List对象 Lis…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部