Engee 文档
Notebook

几乎素数在朱莉娅

这个例子演示了搜索"几乎素数"的算法的实现

导言

几乎素数算法用于查找具有给定数量的素数因子的自然数,同时考虑到多重性。 这些数字在数论、密码学和其他数学领域都有应用。

什么是"几乎素数"?

订单的几乎素数 (k-几乎素数)是一个自然数,它具有精确的 素因子,计数倍数。 例如:

-1-几乎素数(primes): 2, 3, 5, 7, 11...
-2-几乎素数(半简单数字): 4, 6, 9, 10, 14...
-3-几乎素数: 8, 12, 18, 20, 27...

主要部分

在使用外部素数包之前,您必须安装它。:

In [ ]:
import Pkg; Pkg.add("Primes")

我们连接使用素数的必要包:

In [ ]:
using Primes  # 用于处理素数和因式分解的软件包

我们定义一个函数来检查一个数字是否几乎是素数。:

In [ ]:
# 该函数检查数字n是否几乎是阶数k的素数
# 第k阶的几乎素数是具有恰好k个素数因子的数(考虑到多重性)

isalmostprime(n::Integer, k::Integer) = sum(values(factor(n))) == k
Out[0]:
isalmostprime (generic function with 1 method)

factor(n) -返回主要因素及其权力的字典

values(factor(n)) -提取主要因素的力量

sum(values(factor(n))) -所有权力的总和=素因子的总数,考虑到多重性

我们实现main函数生成第一个 订单的几乎素数 :

In [ ]:
# 该函数返回前N个几乎k素数
function almostprimes(N::Integer, k::Integer) 
    # 创建用于存储类型为k的大小为N的结果的向量
    P = Vector{typeof(k)}(undef,N)
    # 初始化已找到数字的计数器和当前已检查数字
    i = 0; n = 2
    # 循环继续,直到我们找到N个数字。
    while i < N
        # 如果当前数在k的量级上几乎是素数
        if isalmostprime(n, k) 
            # 我们将其保存到results数组并递增计数器。
            P[i += 1] = n 
        end
        # 继续下一个数字
        n += 1
    end
    # 我们返回找到的几乎素数的向量
    return P
end
Out[0]:
almostprimes (generic function with 1 method)

我们为从1到5的每个订单生成并输出前10个几乎素数:

In [ ]:
# 对于k从1到5的每个值,我们生成并输出前10个几乎素数
for k in 1:5
    # 我们生成阶数k的前10个几乎素数
    primes_k = almostprimes(10, k)
    # 将数字转换为字符串并用逗号连接
    result_str = join(primes_k, ", ")
    # 我们以格式化的形式输出结果
    println("$k-几乎素数:resul result_str。..")
end
1-почти простые: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29...
2-почти простые: 4, 6, 9, 10, 14, 15, 21, 22, 25, 26...
3-почти простые: 8, 12, 18, 20, 27, 28, 30, 42, 44, 45...
4-почти простые: 16, 24, 36, 40, 54, 56, 60, 81, 84, 88...
5-почти простые: 32, 48, 72, 80, 108, 112, 120, 162, 168, 176...

函数如何工作 factor?

要理解算法,重要的是要知道函数 factor(n) 从包 Primes 返回一个字典,其中键是数字的素数,值是它们的幂。 例如:

  • factor(12) 它会回来的 Dict(2 => 2, 3 => 1) 因为
  • sum(values(Dict(2 => 2, 3 => 1))) =2+1=3,对应三个素因子:2、2、3

结论

我们已经回顾了在Julia语言中搜索几乎素数的算法的实现。 该程序允许您生成各种阶数的几乎质数,这对于数论和其他数学应用的研究非常有用。 使用素数包大大简化了数因式分解的实现。

该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Almost_prime