初等数论精解【2】

文章目录

  • 素数
    • 基础
    • 素数理论
      • 互素
        • 定义
        • 性质
        • 应用
        • 示例
        • 最大公约数
          • 方法一:欧几里得算法
          • 方法二:列举法(适用于较小的数)
          • 欧几里得算法编程实现
          • 扩展欧几里得算法
            • 概述
            • 算法背景
            • 算法原理
            • 算法步骤
            • 应用场景
            • 示例代码
      • 结论
      • 素数分布
        • 素数概述
          • 一、定义
          • 二、性质
          • 三、判断方法
          • 四、应用场景
        • 梅森素数的详细解释
          • 一、定义与背景
          • 二、历史与发现
          • 三、性质与特点
          • 四、寻找与验证
          • 五、总结
        • 判断素数
          • julia程序
          • 计算素数
            • 1. 试除法
            • 2. 埃拉托斯特尼筛法(埃氏筛法)
            • 3. 线性筛法(欧拉筛法)
            • 4. 公式法
          • 总结
          • 计算素数的方法实例
            • 1. 遍历法(试除法)
            • 2. 筛选法(埃拉托斯特尼筛法,简称埃氏筛法)
            • 3. 线性筛法
            • 4. 概率性素数测试(如Miller-Rabin算法)
            • 5. 公式法(如Willans公式)
  • 参考文献

素数

基础

  • 1只有一个正因数,就是它本身,任何大于1的正整数a都最少有二个正因数,就是1和a。
  • 2只能被1和2整除,3只能被1和3整除,2和3是素数
  • 某正整数大于1,且只有1和它本身两个因子,该整数为素数
  • 某正整数被1、它本身整除外,还可以被其它整数整除,则称为复合数。
  • 某正整数b可以整除a,而且,除了1和b本身外,没有其它正整数可以整除b,也就是说b是素数,则b叫做a的素因数。
  • a是一个大于1 的整数,则a的大于1的最小因数一定为素数。

素数理论

下面内容来自文心一言的自动生成。

互素

互素是数学中的一个重要概念,用于描述两个或多个数之间的关系。以下是关于互素的详细解释:

定义

互素(也称为互质)是指两个或多个整数的最大公约数(GCD)为1的情况。换言之,如果两个数之间除了1之外没有其他公约数,则这两个数互素。

性质
  1. 任意两个素数互素:根据素数的定义,素数只能被1和自身整除,因此任意两个素数之间没有其他公约数,只有1,所以它们互素。
  2. 互素不一定都是素数:虽然任意两个素数互素,但互素的两个数不一定都是素数。例如,3和10互素,但10不是素数。
  3. 1的特殊性:1和任何非零自然数都是互素的,因为1是所有整数的公约数,但除了1本身外,没有其他非零自然数与1有公约数。
  4. 相邻自然数与奇数的互素性:相邻的两个自然数(如2和3、3和4等)以及相邻的两个奇数(如3和5、7和9等)都是互素的,因为它们的最大公约数为1。
  5. 质数与不为其倍数的数的互素性:如果一个数是质数,另一个数不是该质数的倍数,则这两个数互素。
应用

互素在数学中有着广泛的应用,特别是在分数的约分、解方程、证明定理等方面。

  • 分数的约分:当分数的分子和分母互素时,可以将其约分到最简形式,从而得到最简分数。例如,4/6可以约分为2/3,因为4和6的最大公约数是2。
  • 解方程:在解方程时,如果两个数互素,那么可以将方程两边同时乘以其中一个数的逆元(即该数在模某个数下的乘法逆元),从而得到更简单的方程。
  • 证明定理:在证明某些数学定理时,互素的概念可以用来证明某些条件下的结论成立。
示例
  • 2和3:2和3是互素的,因为它们的最大公约数为1。
  • 3和10:3和10也是互素的,尽管10不是素数,但它们之间只有1是公约数。
  • 4和6:4和6不是互素的,因为它们的最大公约数为2。

综上所述,互素是数学中描述两个或多个数之间关系的一个重要概念,它基于最大公约数为1的定义,具有多种性质和广泛的应用。

最大公约数

计算最大公约数(GCD,Greatest Common Divisor)是数学中的一个常见任务,特别是在数论和算法设计中。最大公约数是指两个或多个整数共有的最大的那个正整数约数。这里,我将通过几个例子来说明如何计算最大公约数。

方法一:欧几里得算法

欧几里得算法是计算两个整数最大公约数的最常用且最高效的方法。其基本原理基于以下定理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。

示例 1:计算 48 和 18 的最大公约数

  1. 48 除以 18 的余数是 12。
  2. 然后,18 除以 12 的余数是 6。
  3. 接着,12 除以 6 的余数是 0。
  4. 因为余数为 0,所以最后一步的除数 6 就是 48 和 18 的最大公约数。

示例 2:计算 100 和 48 的最大公约数

  1. 100 除以 48 的余数是 52。
  2. 48 除以 52 不够除,所以交换两个数继续,52 除以 48 的余数是 4。
  3. 48 除以 4 的余数是 0。
  4. 因此,4 是 100 和 48 的最大公约数。
方法二:列举法(适用于较小的数)

对于较小的数,我们也可以简单地列举出它们的所有约数,然后找出最大的那个共有的约数。

示例 3:计算 12 和 15 的最大公约数

  1. 列出 12 的所有约数:1, 2, 3, 4, 6, 12。
  2. 列出 15 的所有约数:1, 3, 5, 15。
  3. 比较两个列表,找出共有的约数:1, 3。
  4. 最大的共有约数是 3,所以 12 和 15 的最大公约数是 3。
欧几里得算法编程实现
  • 欧几里得算法
    计算最大公约数(GCD, Greatest Common Divisor)并没有一个直接的“公式”可以像解方程那样直接代入数值得到结果。然而,有几种算法和定理可以用来有效地计算最大公约数,其中最著名的是欧几里得算法

欧几里得算法基于一个基本的数学定理:对于任意两个正整数a和b(假设a≥b),它们的最大公约数等于b和a除以b的余数之间的最大公约数。递归地应用这个定理,直到余数为0,此时最后一个非零余数就是a和b的最大公约数。

虽然这不是一个传统意义上的“公式”,但欧几里得算法可以用以下伪代码表示:

function gcd(a, b)while b ≠ 0t := bb := a mod ba := treturn a

在这个伪代码中,a mod b 表示a除以b的余数。

一个扩展欧几里得算法,它不仅可以计算最大公约数,还可以找到满足ax + by = gcd(a, b)的整数解x和y,这在某些数论问题中非常有用。但这超出了简单计算最大公约数的范畴。

  • Julia实现
    Julia中并没有内置的名为“欧几里得算法”的函数,因为欧几里得算法主要用于计算两个整数的最大公约数(GCD, Greatest Common Divisor),这是一个相对基础的算法,通常可以在多种编程语言中以函数或方法的形式实现。不过,Julia作为一门高性能的动态编程语言,可以轻松实现欧几里得算法。

以下是使用Julia实现欧几里得算法的一个简单示例:

function gcd(a::Integer, b::Integer)while b != 0t = bb = mod(a, b)a = tendreturn a
end

这个函数接受两个整数ab作为输入,并使用欧几里得算法计算它们的最大公约数。算法的核心在于重复执行b = mod(a, b)a = t(其中tb的旧值),直到b变为0。此时,a的值就是两个输入数的最大公约数。

然而,值得注意的是,Julia的标准库stdlib中可能已经包含了计算最大公约数的函数,尽管这个函数可能不是直接以“欧几里得算法”命名的。在Julia中,你可以使用gcd函数来直接计算两个数的最大公约数,这个函数在Int类型的模块中定义,因此你可以直接使用它而无需自己实现。例如:

julia> gcd(48, 18)
6

这表明48和18的最大公约数是6。

总之,虽然Julia没有内置一个名为“欧几里得算法”的函数,但你可以轻松地使用Julia的内置函数或自己实现该算法来计算两个整数的最大公约数。

扩展欧几里得算法

扩展欧几里得算法(Extended Euclidean algorithm)是欧几里得算法(又叫辗转相除法)的扩展。该算法不仅用于计算两个整数的最大公约数(GCD, Greatest Common Divisor),还能找到满足贝祖等式(Bézout’s identity)的一组整数解x和y,即ax + by = gcd(a, b)。以下是关于扩展欧几里得算法的详细解释:

概述
  • 定义:扩展欧几里得算法是在已知两个整数a和b的情况下,求解一组整数x和y,使得它们满足ax + by = gcd(a, b)。
  • 原理:基于欧几里得算法的原理,即gcd(a, b) = gcd(b, a % b),通过递归或迭代的方式,在求解最大公约数的过程中,同时计算出满足贝祖等式的x和y的值。
    扩展欧几里得算法(Extended Euclidean algorithm)是欧几里得算法(又叫辗转相除法)的扩展。该算法不仅用于计算两个整数a和b的最大公约数(GCD),还能找到满足等式ax + by = gcd(a, b)的整数解x和y(其中一个解很可能是负数)。以下是扩展欧几里得算法的详细说明:
算法背景
  • 欧几里得算法:古希腊数学家欧几里得在其著作《几何原本》中描述了这种算法,用于计算两个整数的最大公约数。其基本原理是gcd(a, b) = gcd(b, a mod b),即两个整数的最大公约数等于其中较小数和两数相除余数的最大公约数。
  • 扩展欧几里得算法:在求得最大公约数的同时,还能找到满足ax + by = gcd(a, b)的整数解x和y。这个等式通常被称为贝祖等式(Bézout’s identity)。
算法原理
  • 递归原理:扩展欧几里得算法通过递归地应用欧几里得算法的原理,同时收集每次递归过程中产生的等式,最终可以回推到最初的等式ax + by = gcd(a, b),并找到其整数解。
  • 矩阵变换:算法过程可以通过矩阵变换来表示,每次递归相当于对矩阵进行初等变换,最终得到解。
算法步骤
  • 扩展欧几里得算法的基本步骤
  1. 基本情况:如果b为0,则gcd(a, 0) = a,此时x = 1,y = 0。
  2. 递归步骤:对于非零的b,递归调用扩展欧几里得算法计算gcd(b, a % b)以及对应的x’和y’。
  3. 回代求解:根据递归调用的结果,以及欧几里得算法中的关系,回代求解出满足ax + by = gcd(a, b)的x和y。
  • 扩展欧几里得算法的具体过程

扩展欧几里得算法的递归过程基于这样一个事实:如果 gcd(a, b) = gcd(b, a mod b),并且已知 bx' + (a mod b)y' = gcd(b, a mod b),那么我们可以推导出 ax + by = gcd(a, b) 的解 xy

递归的基本思想是,当我们不断地将问题规模缩小(即不断地将较大的数替换为余数),直到其中一个数为0时,递归结束。此时,另一个非零的数就是两个原始数的最大公约数(gcd)。同时,在递归过程中,我们还需要维护两个整数 xy,使得在递归的每一步,都满足 ax + by = gcd(a, b)

以下是扩展欧几里得算法递归过程的详细步骤:

  1. 基本情况:如果 b == 0,则 gcd(a, b) = a,此时 x = 1, y = 0(或等价地,任何满足 ax + 0y = axy 的值)。递归结束。

  2. 递归步骤:如果 b != 0,则计算 a 除以 b 的商 q 和余数 rr = a mod b)。然后,递归地调用扩展欧几里得算法来计算 gcd(b, r) 以及对应的 x'y',使得 bx' + ry' = gcd(b, r)

  3. 回代:在得到 x'y' 之后,我们需要利用它们来计算出 xy。由于 gcd(a, b) = gcd(b, r),并且 r = a - qb,我们可以将 bx' + ry' = gcd(b, r) 改写为 bx' + (a - qb)y' = gcd(a, b),进一步化简得到 ax + by = gcd(a, b),其中 x = y'y = x' - qy'

  4. 返回结果:递归结束后,返回 gcd(a, b) 以及对应的 xy

以下是扩展欧几里得算法递归过程的伪代码表示:

function exgcd(a, b, x, y)if b == 0x = 1y = 0return aelsegcd = exgcd(b, a mod b, x', y')x = y'y = x' - (a // b) * y' // 注意这里使用整除来避免浮点数return gcd

注意:在实际编程中,由于递归调用需要保存 xy 的前一个值(即 x'y'),我们通常会在函数参数中传递这些值的引用(或指针),或者使用其他数据结构(如元组、结构体等)来同时返回多个值。上面的伪代码为了简洁起见,没有直接展示这种传递方式。

另外,请注意在递归调用之后,我们根据递归调用的结果来更新 xy 的值。这是通过利用 bx' + (a mod b)y' = gcd(b, a mod b)a mod b = a - qb 这两个等式来完成的。

应用场景
  • 求解模逆元:在密码学等领域,特别是RSA加密算法中,模逆元扮演着重要角色。扩展欧几里得算法可以用来计算模逆元。
  • 求解线性同余方程:形如ax ≡ b (mod m)的线性同余方程,可以通过扩展欧几里得算法求解。
  • 解决不定方程:对于形如ax + by = c的不定方程,如果c是gcd(a, b)的倍数,则可以通过扩展欧几里得算法找到一组解,并进一步求解所有整数解。
示例代码

Julia的扩展欧几里得算法(Extended Euclidean Algorithm)是一种在数论中常用的算法,它不仅能够计算两个整数a和b的最大公约数(GCD, Greatest Common Divisor),还能找到满足等式ax + by = gcd(a, b)的整数解x和y。这个等式被称为扩展欧几里得定理,它实际上是裴蜀定理(Bézout’s Identity)的一个特例。

  • 扩展欧几里得算法的基本思想

扩展欧几里得算法基于欧几里得算法(Euclidean Algorithm),后者是一种用于计算两个正整数最大公约数的有效方法。欧几里得算法的核心思想是:gcd(a, b) = gcd(b, a mod b),其中a mod b是a除以b的余数。通过递归地应用这个等式,直到其中一个数为0,此时另一个数就是最大公约数。

扩展欧几里得算法在欧几里得算法的基础上,通过回溯的方式找到满足ax + by = gcd(a, b)的整数解x和y。

  • 代码
    在Julia中,虽然没有内置的扩展欧几里得算法函数,但我们可以很容易地根据算法原理自己实现。以下是一个简单的Julia函数实现示例:
function extended_gcd(a, b)if b == 0return a, 1, 0  # 返回gcd(a, b), x, yelsegcd, x1, y1 = extended_gcd(b, a % b)x,y = y1, x1 - Int(floor(a // b)) * y1return gcd, x, yend
end

这个函数通过递归调用自身来计算gcd,并在递归返回时通过公式更新x和y的值。当递归到b为0时,根据扩展欧几里得定理,我们知道此时a就是gcd,且x和y可以取为1和0(因为a1 + 00 = a)。然后,函数通过回溯逐步计算出满足条件的x和y。

  • 使用示例

假设我们要计算gcd(48, 18)并找到满足48x + 18y = gcd(48, 18)的整数解x和y:

gcd, x, y = extended_gcd(48, 18)
println("gcd = $gcd, x = $x, y = $y")

输出可能是:

gcd = 6, x = -1, y = 3

这意味着48*(-1) + 18*3 = 6,确实满足条件。

结论

Julia的扩展欧几里得算法是一种强大的工具,它不仅可以用于计算最大公约数,还可以找到满足特定等式的整数解。通过递归和回溯的方式,我们可以高效地实现这个算法,并在各种数论问题中发挥其作用。

素数分布

素数(或称质数)是指一个大于1的整数,除1和它本身外,不能被其他的正整数所整除。素数的分布是数论中研究素数性质的重要课题,其分布状况一直吸引着数学家们的关注。以下是对素数分布的详细说明:
一、素数的基本性质

  • 定义:素数是一个大于1的自然数,除了1和它本身以外不再有其他因数。
  • 无穷性:欧几里得在公元前300年左右就证明了素数有无穷多个。

二、素数的分布规律

  • 离散分布:素数离散分布于自然数无穷数列之中,没有简单的公式可以直接生成所有素数。
  • 素数定理:素数定理是研究素数分布的中心定理,它给出了不大于x的素数个数π(x)的近似值,即π(x) ~ x/ln(x)。其中,ln(x)表示x的自然对数。这个定理表明,随着x的增大,π(x)与x/ln(x)的比值越来越接近于1。
  • 平均间距:素数的平均间距呈现对数级别的增长,即随着x的增大,相邻素数的平均间距也越来越大,但增长的速度是缓慢的、稳定的,并且具有可预见性。具体来说,指定范围内相邻素数的平均间距t(x)可以近似表示为ln(x)。
  • 动态平均间距:更为精确的素数平均间距t(x)可以表示为ln(x)-1,这是基于黎曼猜想等更深入的数学研究得出的结论。

三、特殊素数分布

  • 孪生素数:孪生素数是指相差为2的一对素数,如3和5、11和13等。孪生素数猜想认为存在无穷多对孪生素数,但这个猜想至今仍未被证明。
  • 梅森素数,又称 2 p − 1 2^p-1 2p1型素数,是数论研究中的一项重要内容。它是指形如 2 p − 1 2^p-1 2p1的素数,其中指数p是素数,常记为Mp。

四、素数分布的应用

素数分布的研究不仅具有理论意义,还具有广泛的应用价值。例如,在密码学中,素数被广泛应用于公钥加密、数字签名等领域,其安全性基于素数分布的复杂性和难以预测性。
五、总结

素数分布是数论中一个复杂而迷人的课题。尽管我们已经对素数分布有了一定的了解,但仍有许多未解之谜等待我们去探索。随着数学和计算机科学的不断发展,相信我们将能够更深入地理解素数的分布规律,并发现更多关于素数的奇妙性质。

素数概述

素数,也被称为质数,是数学中一个重要的概念。以下是对素数的详细解释:

一、定义
  • 基本定义:素数是一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数。换句话说,这个数除了1和它本身以外不再有其他的因数。
  • 举例说明:例如,2、3、5、7等都是素数,因为它们只能被1和自己整除。而4、6、8等则不是素数,因为它们除了1和自己外,还能被其他自然数整除。
二、性质
  1. 唯一分解定理:任何一个大于1的自然数都可以分解成几个素数连乘积的形式,而且这种分解是唯一的。这是素数的一个重要性质,也是数论中的基本定理之一。
  2. 无限性:素数的个数是无限的。这意味着无论我们找到多少个素数,总还有更多的素数存在。
  3. 存在性 对于任意正整数 n ( n ≥ 2 ) ,在 n 到 n ! ( n 的阶乘)之间至少存在一个素数。这是素数存在性的一个重要结论。 对于任意正整数n(n≥2),在n到n!(n的阶乘)之间至少存在一个素数。这是素数存在性的一个重要结论。 对于任意正整数n(n2),在nn!n的阶乘)之间至少存在一个素数。这是素数存在性的一个重要结论。
  4. 个位数特性:所有大于10的素数中,个位数只有1、3、7、9。这是一个有趣的观察结果,但并非所有个位数为这些数字的数都是素数。
  5. 质因数分布 在 n ! ( n 的阶乘)中,质因子 k 的个数有一个特定的计算公式,即 在n!(n的阶乘)中,质因子k的个数有一个特定的计算公式,即 n!n的阶乘)中,质因子k的个数有一个特定的计算公式,即 [ n / k ] + [ n / k 2 ] + [ n / k 3 ] + … … [n/k] + [n/k^2] + [n/k^3] + …… [n/k]+[n/k2]+[n/k3]+……$,其中[x]表示不超过x的最大整数。
三、判断方法

判断一个数是否为素数有多种方法,以下是一些常见的方法:

  1. 暴力法:最直接的方法是遍历从2到该数本身的所有自然数,看是否存在能整除该数的数。但这种方法效率较低,特别是对于较大的数。
  2. 优化暴力法:由于一个数如果可以因数分解(不是质数),那么分解得到的两个数一定是一个小于等于该数的平方根,一个大于等于该数的平方根。因此,我们只需要判断从2到该数平方根的所有数是否能整除该数即可。
  3. 筛法:筛法是一种更高效的寻找素数的方法。其中,埃拉托斯特尼筛法(简称埃筛法)和欧拉筛法(简称欧筛法)是两种常用的筛法。埃筛法通过标记一个数的倍数来排除非素数,而欧筛法则在埃筛法的基础上进行了优化,避免了重复标记的问题。
四、应用场景

素数在许多领域都有广泛的应用,以下是一些具体的应用场景:

  1. 密码学:素数在密码学中扮演着非常重要的角色。例如,RSA加密算法就基于大素数分解的困难性。在这种算法中,公钥是由两个大素数的乘积组成,而私钥则包含这两个大素数。由于分解大素数的乘积非常困难,所以RSA算法提供了很高的安全性。
  2. 计算机科学:在计算机科学中,素数被用来生成伪随机数,这在许多算法和程序中都是必要的。此外,素数也被用于哈希函数的构造,哈希函数能将任意长度的数据映射为固定长度的哈希值,而素数在其中起到了关键作用。
  3. 信息论:在信息论中,素数被用来进行数据的纠错和检错。例如,在某些校验码中,会使用到素数以保证数据的完整性和准确性。
  4. 数学和物理学:在数学和物理学中,素数也经常出现。例如,在解决某些数学问题(如数论中的费马大定理)时,素数起到了关键作用。在物理学中,素数也被用来描述某些现象,如量子力学中的波函数。
  5. 生物学和生命科学:在生物学和生命科学中,素数甚至被用来描述某些生物现象。例如,有一种理论认为,某些生物的生命周期可能与素数有关,因为这有助于它们避免与天敌的生命周期同步。
梅森素数的详细解释
一、定义与背景
  • 定义:梅森素数是指形如 2 p − 1 2^p-1 2p1的素数,其中p是素数。若梅森数是素数,则称为梅森素数。
  • 开创者:梅森素数的研究可以追溯到古希腊数学家欧几里得,但真正系统而深入地研究这类数的是17世纪的法国数学家马林·梅森。因此,数学界将这类数命名为“梅森素数”。
二、历史与发现
  • 早期研究:早在公元前300多年,古希腊数学家欧几里得就在《几何原本》中论述了完全数与 2 p − 1 2^p-1 2p1型素数的关系。
  • 梅森的贡献:1644年,马林·梅森在《物理数学随感》一书中断言了当p为某些特定素数时(如2、3、5、7等), 2 p − 1 2^p-1 2p1是素数。这一断言激发了人们对梅森素数的研究热情。
  • 现代发现:随着计算机技术的发展,人们能够更高效地寻找梅森素数。迄今为止,已经发现了多个梅森素数,其中最大的是M82589933(即2^82589933-1),有24862048位。
三、性质与特点
  • 稀缺性:梅森素数非常稀缺,随着p的增大, 2 p − 1 2^p-1 2p1是素数的概率逐渐降低。
  • 重要性:梅森素数在数论、密码学等领域具有重要的应用价值。例如,在密码学中,梅森素数常被用于生成大素数,以提高加密算法的安全性。
  • 分布规律:梅森素数的分布极不规则,有时多年未能找到一个,而有时则一下找到好几个。数学家们一直在探索梅森素数的分布规律,但至今仍未有定论。
四、寻找与验证
  • 寻找方法:目前寻找梅森素数的主要方法是使用计算机进行大规模的计算和验证。例如,可以通过Lucas-Lehmer测试法来判定一个梅森数是否是素数。
  • 验证难度:随着p的增大,验证 2 p − 1 2^p-1 2p1是否是素数的难度也急剧增加。这不仅需要高深的数学理论支持,还需要强大的计算能力和高效的算法支持。
五、总结

梅森素数是数论研究中的一项重要内容,它具有独特的性质和应用价值。随着计算机技术和数学理论的发展,我们相信人类将能够发现更多、更大的梅森素数,并深入探索其背后的数学奥秘。

判断素数
julia程序

在Julia中,编写一个判断素数的程序是一个相对直接的过程。以下是一个简单的Julia函数,用于判断给定的正整数是否为素数:

function isPrime(n::Integer)# 小于2的数不是素数if n < 2return falseend# 2是最小的素数if n == 2return trueend# 排除偶数(除了2)if mod(n, 2) == 0return falseend# 只需检查到sqrt(n)即可sqrt_n = isqrt(n)for i = 3:2:sqrt_nif mod(n, i) == 0return falseendendreturn true
end# 测试函数
for num in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 17, 101, 10007]println(num, " is prime? ", isPrime(num))
end

在这个程序中,isPrime 函数首先检查传入的数 n 是否小于2(因为素数定义中要求大于1),然后检查是否为2(2是唯一的偶数素数)。接下来,它排除了所有大于2的偶数,因为除了2之外的所有偶数都不是素数。

为了进一步优化性能,函数只检查到 sqrt(n) 的所有奇数(因为如果一个数 n 不是素数,那么它必定有一个因子不大于它的平方根)。这里使用了Julia的内置函数 isqrt 来计算平方根(向下取整),并且通过一个步长为2的循环来迭代所有奇数。

最后,如果 n 不能被任何小于或等于其平方根的奇数整除,则函数返回 true,表示 n 是素数;否则,返回 false

在测试部分,我们通过一个循环遍历了一系列数字,并打印出每个数字是否为素数的结果。

计算素数

计算素数(质数)的方法有多种,每种方法都有其特点和适用场景。以下是一些常见的计算素数的方法:

1. 试除法

试除法是最直接也是最基础的方法,其基本思路是:对于待判断的数n(n>1),检查它是否能被2到sqrt(n)之间的任何整数整除。如果不能,则n是素数;否则,n不是素数。

步骤

  1. 首先确定n是否大于1,若不大于1则不是素数。
  2. 从2开始,依次用n除以2、3、…、直到sqrt(n)(开平方)。
  3. 若n能被其中任意一个数整除,则n不是素数;反之,如果n不能被这些数整除,则n是素数。

时间复杂度:O(sqrt(n))

2. 埃拉托斯特尼筛法(埃氏筛法)

埃拉托斯特尼筛法是一种用于找出一定范围内所有素数的算法。该算法由古希腊数学家埃拉托斯特尼提出。

步骤

  1. 创建一个布尔数组isPrime,长度为n+1,并将所有元素初始化为true(假设所有数都是素数)。注意,0和1不是素数,但通常在这个算法中不需要特别处理,因为后续步骤会自动排除它们。
  2. 从2开始,将数组中所有2的倍数(除了2本身)标记为false(即非素数)。
  3. 对于下一个未被标记为false的数p(即p是素数),将数组中所有p的倍数(除了p本身)标记为false。
  4. 重复步骤3,直到p^2大于n为止。因为当p>sqrt(n)时,p的倍数已经超过了n,无需再检查。
  5. 最后,数组中未被标记为false的数即为素数。

时间复杂度:O(n log log n)

3. 线性筛法(欧拉筛法)

线性筛法是埃氏筛法的优化版本,能够在O(n)的时间复杂度内找出所有小于等于n的素数。

步骤

  1. 创建一个布尔数组isPrime,长度为n+1,并将所有元素初始化为true。
  2. 创建一个数组prime,用于存储找到的素数。
  3. 遍历从2到n的所有数i:
    • 如果isPrime[i]为true,则将i加入prime数组。
    • 遍历prime数组中的所有素数p,并计算ip的值。对于每个p,如果ip大于n,则停止遍历;否则,将isPrime[ip]标记为false。特别地,如果i能被p整除(即i%p==0),则停止遍历prime数组中的后续素数,因为此时ip的倍数已经在之前的步骤中被筛去。
  4. 遍历结束后,prime数组中存储的就是所有小于等于n的素数。

时间复杂度:O(n)

4. 公式法

虽然直接通过公式生成所有素数是不可能的,但可以利用一些数学性质来减少试除的次数。例如,除了2和3之外,所有的素数都可以表示成6N±1的形式(N为自然数)。因此,在试除时,可以只考虑形如6N±1的数,从而减少试除的次数。然而,这种方法并不能直接生成素数,而是提供了一种优化试除过程的思路。

总结

计算素数的方法有多种,其中试除法和埃氏筛法是最常用的两种方法。对于需要找出一定范围内所有素数的情况,可以使用埃氏筛法或更高效的线性筛法。而对于单个数的素数判断,试除法是一种简单直接的方法。在实际应用中,可以根据具体需求选择合适的方法。

计算素数的方法实例

计算素数(质数)的方法多种多样,每种方法都有其特定的应用场景和优缺点。以下是一些常见的计算素数的方法,并通过实例进行说明:

1. 遍历法(试除法)

原理:遍历从2到该数平方根(sqrt)的所有整数,检查它们是否能整除目标数。如果不能,则目标数为素数。

实例:判断17是否为素数。

  • 从2开始遍历到sqrt(17)(约等于4.12,因此遍历到4)。
  • 2不能整除17,3不能整除17,4也不能整除17。
  • 因此,17是素数。
2. 筛选法(埃拉托斯特尼筛法,简称埃氏筛法)

原理:从最小的素数2开始,标记其所有倍数为非素数,然后找到下一个未标记的数,继续标记其所有倍数为非素数,直到处理完所有数。

实例:找出1到30之间的所有素数。

  • 初始列表:2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30。
  • 首先标记2的倍数(除了2本身):4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30。
  • 然后找到下一个未标记的数3,标记3的倍数:9, 15, 21, 27(注意:6, 12, 18等已被标记)。
  • 接着是5(跳过4,因为它是2的倍数):标记5的倍数:25(注意:10, 15, 20已被标记)。
  • 以此类推,直到所有数都被处理。
  • 最后剩下的未标记的数为素数:2, 3, 5, 7, 11, 13, 17, 19, 23, 29。
3. 线性筛法

原理:基于埃氏筛法,但通过一些优化,确保每个合数只被其最小的质因数筛去一次,从而提高效率。

实例:实现过程较为复杂,通常通过编程实现。基本思想是维护一个素数列表和一个标记数组,遍历每个数,如果该数未被标记,则加入素数列表,并标记其所有倍数(但只使用素数列表中的数作为倍数因子,以避免重复标记)。

4. 概率性素数测试(如Miller-Rabin算法)

原理:基于费马小定理的逆否命题,通过随机选择测试基数进行多次测试,以高概率判断一个数是否为素数。

实例:对于大数,直接使用遍历法或筛选法可能效率极低,此时可以使用Miller-Rabin算法进行快速测试。算法的具体实现涉及复杂的数学原理和编程技巧,通常通过编程库或工具来完成。

5. 公式法(如Willans公式)

原理:利用特定的数学公式直接计算第n个素数的值。但需要注意的是,这类公式通常计算复杂且效率不高,主要用于理论研究。

实例:Willans公式是一个复杂的数学表达式,它给出了第n个素数的近似值,但计算起来非常耗时且不适合实际应用。

综上所述,计算素数的方法多种多样,每种方法都有其适用的场景和优缺点。在实际应用中,应根据具体需求选择合适的方法。

参考文献

1.文心一言
2.《初等数论》陈景润

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

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

相关文章

GO:Socket编程

目录 一、TCP/IP协议族和四层模型概述 1.1 互联网协议族&#xff08;TCP/IP&#xff09; 1.2 TCP/IP四层模型 1. 网络访问层&#xff08;Network Access Layer&#xff09; 2. 网络层&#xff08;Internet Layer&#xff09; 3. 传输层&#xff08;Transport Layer&#…

WPF+Mvvm 项目入门完整教程(一)

WPF+Mvvm 入门完整教程一 创建项目MvvmLight框架安装完善整个项目的目录结构创建自定义的字体资源下载更新和使用字体资源创建项目 打开VS2022,点击创建新项目,选择**WPF应用(.NET Framework)** 创建一个名称为 CommonProject_DeskTop 的项目,如下图所示:MvvmLight框架安装…

机器学习-19-基于交互式web应用框架streamlit和gradio转化数据和机器学习模型

参考Streamlit:简单快速的Python Web应用开发工具 参考Python(Web时代)—— 超简单:一行代码就能搭建网站 参考对比Streamlit和Gradio:选择最适合你的Python交互式应用框架 参考Gradio:构建交互式界面的简单而强大的Python库 参考【吴恩达 X HuggingFace】使用Gradio快速…

【JavaScript 算法】双指针法:高效处理数组问题

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、算法原理二、算法实现示例问题1&#xff1a;两数之和 II - 输入有序数组示例问题2&#xff1a;反转字符串中的元音字母注释说明&#xff1a; 三、应用场景四、总结 双指针法&#xff08;Two Pointer Technique&#xff…

sqlalchemy_dm

1、参考文档&#xff1a; https://blog.csdn.net/njcwwddcz/article/details/126554118 https://eco.dameng.com/document/dm/zh-cn/pm/dmpython-dialect-package.html 2、生成工具 sqlalchemy2.0.0.zip 3、安装步骤 conda create --name kes --clone kes1 rz unzip sql…

高等数学用到的初等数学

指数 同指不同底乘法 (ab)xaxbx

如何做到高级Kotlin强化实战?(三)

高级Kotlin强化实战&#xff08;二&#xff09; 2.13 constructor 构造器2.14 Get Set 构造器2.15 操作符2.16 换行 2.13 constructor 构造器 //Java public class Utils { private Utils() {} public static int getScore(int value) { return 2 * value;} }//Kotlin class U…

深入理解Java并发线程阻塞唤醒类LockSupport

LockSupprot 用来阻塞和唤醒线程&#xff0c;底层实现依赖于Unsafe类 该类包含一组用于阻塞和唤醒线程的静态方法&#xff0c;这些方法主要是围绕 park 和 unpark 展开 public class LockSupportDemo1 {public static void main(String[] args) {Thread mainThread Thread.cu…

实时吸烟检测系统:基于深度学习与YOLO模型的完整实现

引言 在公共场所吸烟不仅有害吸烟者的健康&#xff0c;也会影响到周围的人。为了更好地管理和监控公共场所的吸烟行为&#xff0c;本文介绍了一种基于深度学习的吸烟检测系统。该系统包含一个用户界面&#xff0c;利用YOLO&#xff08;You Only Look Once&#xff09;v8/v7/v6…

微信小程序(百战商城)的实战项目的首页的制作及讲解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

【人工智能】基于香橙派AIpro和昇腾AI计算芯片的面部口罩检测(详细教程)

目录 前言 1.介绍开发板 2.应用场景 3.安装操作系统 3.1 下载工具 3.2 烧录系统 3.3 系统装载 4.配置操作系统 4.1 登录系统账户 4.2 配置网络连接 4.3 查看设备网络 4.4 配置远程连接 5.部署目标检测应用 5.1 准备运行环境 5.2 模型二次训练 ​5.3 热成像温度…

JavaScript 异步编程:提升现代Web应用的性能与体验

异步概念解析 在编程领域&#xff0c;异步&#xff08;Asynchronous&#xff09;是一种允许程序继续执行而不等待某个操作完成的机制&#xff0c;与之相反的是同步&#xff08;Synchronous&#xff09;&#xff0c;其中程序会暂停并等待每个操作完成才继续下一步。异步编程的核…

数据结构 day4

目录 思维导图&#xff1a; 学习内容&#xff1a; 1. 链表的引入 1.1 顺序表的优缺点 1.1.1 优点 1.1.2 不足 1.1.3 缺点 1.2 链表的概念 1.2.1 链式存储的线性表叫做链表 1.2.2 链表的基础概念 1.3 链表的分类 2. 单向链表 2.1 节点结构体类型 2.2 创建链表 2.…

pikachu之暴力破解

1基于表单的暴力破解 随便输入然后抓包 选中添加账号密码 添加分别添加payload1&#xff0c;2&#xff0c;的字典 开始攻击 2验证码绕过on server 和基于表单的暴力破解相比&#xff0c;多了一个验证码功能 这个验证码是前端的验证码&#xff08;和前面那个一样选中添加账号密码…

Java小技能:多级组织机构排序并返回树结构(包含每个层级的子节点和业务数据集合)

文章目录 引言I 实体定义1.1 部门1.2 用户组织机构中间表1.3 树状DTOII 抽取组织机构排序方法2.1 树状排序方法2.2 案例III 查询条件构建3.1 根据部门进行权限控制3.2 注入风险引言 需求: 根据组织机构进行数据授权控制,例如控制船舶、船舶设备、摄像头、港区查看权限。 一…

3.设计模式--创建者模式--工厂模式

3.设计模式–创建者模式–工厂模式 3.1简单工厂和静态 工厂&#xff08;不属于23中设计模式&#xff09; //抽象类&#xff1a;定义了产品的规范&#xff0c;描述了产品的主要特性和功能 public interface Tea {public abstract void setName();public abstract String getNa…

Flask校验

WTForms 是一个 Python 库&#xff0c;用于处理和验证 Web 表单。它提供了很多功能来简化表单处理&#xff0c;包括字段类型、验证器、错误消息等。在 WTForms 中&#xff0c;validate 机制是用于确保表单数据满足特定条件的关键部分。 1.验证器&#xff08;Validators&#x…

kettle从入门到精通 第七十六课 ETL之kettle kettle连接hive教程

1、群里有小伙伴询问kettle连接hive的demo&#xff0c;今天抽点时间整理下。其实kettle连接hive和连接mysql数据库也是一样的。 1&#xff09;kettle中的lib目录下放hive驱动jar&#xff0c;这里我使用的是kyuubi-hive-jdbc-shaded-1.9.0.jar。 2&#xff09;设置hive连接参数…

pytorch学习(九)激活函数

1.pytorch常用激活函数如下&#xff1a; #ReLU激活函数 #Leaky ReLU激活函数 #Sigmoid激活函数 #Tanh激活函数 #Softmax激活函数 #Softplus2.代码 import torch.nn as nn import torch import numpy from torch.utils.tensorboard import SummaryWriterwriter SummaryWriter…

ModuleNotFoundError: No module named ‘lime‘,lime。 安装 LIME库

LIME LIME 的作用安装 LIME示例代码详细解释 总结 LIME&#xff08;Local Interpretable Model-agnostic Explanations&#xff0c;局部可解释不可知模型&#xff09;是一个Python库&#xff0c;用于解释机器学习模型的预测结果。它通过构建一个简单的、本地的可解释模型来近似…