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

使用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#实现简易画图板的示例代码”的完整攻略。 1. 分析需求 在我们开始编写代码之前,首先需要分析我们的需求,明确我们需要实现什么功能。在这个例子中,我们需要实现一个简易的画图板,其中主要涵盖以下功能: 绘制直线、矩形、圆形等基本图形 选择画笔颜色和大小 橡皮擦功能 保存绘图结果 2. 准备工作 在开始编写代码之前,我们需要先完成一些准备…

    C# 2023年5月31日
    00
  • 使用JsonConverter处理上传文件的路径问题

    为了讲解使用JsonConverter处理上传文件的路径问题的完整攻略,我们首先需要了解以下几点: 在使用表单上传文件时,文件被上传到服务器的临时目录中,而其路径是以操作系统为基础的绝对路径。 在Json格式中,使用斜杠(/)来表示路径分隔符。 在路径处理中,我们需要处理不同操作系统下的路径分隔符,因为在Windows上使用反斜杠(\)作为路径分隔符,在Un…

    C# 2023年5月31日
    00
  • C#的path.GetFullPath 获取上级目录实现方法

    下面就是使用C#中的Path类的GetFullPath方法获取上级目录的实现方法。 1. 基本用法 Path.GetFullPath方法可以将相对路径转换为绝对路径,同时也可以获取当前路径的完整路径。 下面是示例代码: string path = "../example.txt"; string fullPath = Path.GetFu…

    C# 2023年6月1日
    00
  • C#导入和导出CSV文件

    C#语言常用于进行数据处理和分析,CSV(逗号分隔值)是一种常见的数据存储格式。在C#应用程序中,我们可以通过导入和导出CSV文件的方法来实现数据交换和处理。接下来,我将为您详细讲解“C#导入和导出CSV文件”的完整攻略。 导出CSV文件 导出CSV文件是指将程序中的数据通过CSV格式的方式保存到本地文件中。下面是导出CSV文件的详细步骤: 1. 定义数据源…

    C# 2023年6月1日
    00
  • C#实现只运行单个实例应用程序的方法(使用VB.Net的IsSingleInstance)

    实现只运行单个实例应用程序的方法,在C#中可以通过使用Mutex实现。Mutex是一种用于互斥访问共享资源的同步基元。在应用程序的运行过程中,只允许存在一个互斥体。如果进程试图创建同名的互斥体,则只能打开已存在的同名互斥体,而不是创建一个新的互斥体。 下面是实现只运行单个实例应用程序的方法的代码片段: using System.Threading; // 定…

    C# 2023年6月3日
    00
  • C# Linq的Any()方法 – 确定序列中是否存在元素

    Any() 方法是 C# LINQ 中的一种用于判断集合中是否存在任何元素满足给定条件的方法。此方法的语法如下: bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); 其中,source 是需要检查的集合,pr…

    C# 2023年4月19日
    00
  • C#实现托盘程序并禁止多个应用实例运行的方法

    我来为您详细讲解“C#实现托盘程序并禁止多个应用实例运行的方法”的完整攻略: 实现托盘程序 实现托盘程序需要使用到.Net Framework提供的NotifyIcon控件,下面是一个简单的示例代码: private NotifyIcon notifyIcon; // 托盘图标 public Form1() { InitializeComponent(); …

    C# 2023年6月7日
    00
  • .NET 6开发TodoList应用之使用AutoMapper实现GET请求

    一、前言 本文将会详细讲解如何使用AutoMapper实现GET请求。在本文中,我们将会使用.NET 6和AutoMapper来搭建一个TodoList应用程序,以便我们更好的理解AutoMapper的作用。 二、什么是AutoMapper AutoMapper是一个.NET的对象映射库。它的作用是将一个对象类型的数据转换为另一个对象类型的数据。因为在实际项…

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