升序素数
在这个例子中,我们正在实现一个算法,它找到由从1到9的递增数字组成的所有素数。
导言
搜索递增素数的算法旨在查找所有可以使用从1到9的数字按升序组成的素数。 这意味着数字中的每个后续数字都不小于前一个数字。 该算法用于演示如何在Julia编程语言中使用组合数和素数。 它在数学和奥林匹克问题中找到应用,需要找到某些数字子集。
In [ ]:
# 安装必要的软件包
import Pkg; Pkg.add(["Combinatorics", "Primes", "BenchmarkTools"])
In [ ]:
# 连接必要的库
using Combinatorics # 用于使用组合函数(例如,powerset)
using Primes # 检查一个数字是否为素数
using BenchmarkTools # 来估计执行时间
主要部分
功能 ascendingprimes()
此函数生成从1到9的所有可能的非空位子集,将它们转换为数字,并仅留下素数。 让我们来看看工作一步一步。
In [ ]:
# Ascendingprimes函数的定义
function ascendingprimes()
# 生成集合的所有可能子集[1, 2, 3, 4, 5, 6, 7, 8, 9]
# powerset创建集合元素的所有可能组合,包括一个空集
# 我们过滤子集,只留下非空的(!isempty(x))
# 然后对于每个子集:
# -reverse(x)扩展子集(例如, [1,2,3] -> [3,2,1])
# -evalpoly(10,reverse(x))计算基数为10的多项式的值
# 这会将数字列表转换为数字(例如[1,2,3]->321)
# -过滤器(isprime,。..)只留下素数
return filter(isprime, [evalpoly(10, reverse(x)) for x in powerset([1, 2, 3, 4, 5, 6, 7, 8, 9]) if !isempty(x)])
end
Out[0]:
结果输出
下面的代码以格式化的形式输出找到的素数,每行将它们分成10个数字。
In [ ]:
# 以格式化形式输出所有素数
# foreach对每个枚举元素应用函数
# 枚举将索引添加到列表项
# rpad(p[2],10)在右侧添加空格,使数字占用10个字符。
# p[1]%10==0? "\n":""-如果索引可以被10整除,则添加换行符
foreach(p -> print(rpad(p[2], 10), p[1] % 10 == 0 ? "\n" : ""), enumerate(ascendingprimes()))
测量执行时间
最后一行使用@btime宏测量ascendingprimes()函数的执行时间。
In [ ]:
# 测量ascendingprimes()函数的执行时间
@btime ascendingprimes()
Out[0]:
结论
在这个例子中,我们研究了Julia语言中搜索增加素数的算法的实现。 我们使用Combinatorics包生成从1到9的所有可能的数字子集,以及Primes包来检查数字的素数。 我们设法创建了一个函数,该函数查找由递增数字组成的所有素数,并以人类可读的格式输出它们。 这个例子展示了Julia语言在数学计算、组合学和处理素数方面的力量,这在解决各种数学问题和算法奥林匹克竞赛中是有用的。
该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Ascending_primes )