几乎素数在朱莉娅
这个例子演示了搜索"几乎素数"的算法的实现
导言
几乎素数算法用于查找具有给定数量的素数因子的自然数,同时考虑到多重性。 这些数字在数论、密码学和其他数学领域都有应用。
什么是"几乎素数"?
订单的几乎素数 (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]:
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]:
我们为从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
函数如何工作 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 )