Engee 文档
Notebook

相互简单的三元组

这个例子演示了在Julia编程语言中找到互质三元组的算法的实现,该算法收集了一个数字序列,其中每三个连续的数字都是互质的。

导言

寻找无限简单三元组的算法构建了一个自然数序列,使得其中每三个连续的数字是两两互质的。 也就是说,对于任何数 按顺序,数字 , 它们必须是这样的,其中任何两个除了1之外没有共同的除数。

该算法在数论的背景下很有趣,可用于与生成具有某些可分性属性的序列相关的问题。

这段代码实现了一个构建这样一个序列的函数,在每个步骤中添加一个还不是序列的一部分并且与前两个数字互质的最小可能的自然数。

主要部分

声明函数 coprime_triplets 与参数 less_than 默认值为50。

In [ ]:
function coprime_triplets(less_than = 50)

    # 初始序列:前两个元素是1和2。
    # 这些是序列构建开始的初始条件。
    cpt = [1, 2]

    # 无限循环是测序的基本逻辑。
    while true

        # 变量m是序列中下一个数字的候选项。
        # 最初,我们从1开始。
        m = 1

        # 只要候选m满足其中一个条件:
        # -已经在序列中(cpt中的m)
        # -与前一个数字(gcd(m,cpt[end])不是相互简单的!= 1)
        # -不是与前面的数字(gcd(m,cpt[end-1])相互简单!= 1)
        # 我们将m增加1。
        while m in cpt || gcd(m, cpt[end]) != 1 || gcd(m, cpt[end - 1]) != 1
            m += 1
        end

        # 如果m已经达到或超过less_than的值,我们终止函数。
        if m >= less_than
            return cpt
        end

        # 如果m适合,则将其添加到序列中。
        push!(cpt, m)
    end
end
Out[0]:
coprime_triplets (generic function with 2 methods)

定义函数后,我们使用默认参数(最多50个)调用它,我们得到一个就绪序列。 trps.

调用一个函数得到一个最多50的数字序列.

In [ ]:
trps = coprime_triplets();

我们输出序列中找到的数字的数量。

In [ ]:
println("找到$(length(trps))小于50的简单三元组:")
Найдено 36 взаимно простых троек, меньших 50:

我们将所有数字打印成一行,每行10个数字。

  • enumerate(trps) -创建对(索引,值)

  • foreach -为每个元素执行一个操作

  • rpad(p[2], 3) -3个字符宽的字符串中的数字对齐

  • p[1] %10 == 0 ? "\n" : "" —如果元素编号是10的倍数,则添加换行符

In [ ]:
foreach(p -> print(rpad(p[2], 3), p[1] % 10 == 0 ? "\n" : ""), enumerate(trps))
Found 36 coprime triplets less than 50:
1  2  3  5  4  7  9  8  11 13 
6  17 19 10 21 23 16 15 29 14 
25 27 22 31 35 12 37 41 18 43 
47 20 33 49 26 45 

结论

在这个例子中,我们研究了Julia语言中搜索相互交叉三元组的算法的实现。 该算法构建了一个数字序列,其中每三个连续的数字成对为素数。 我们已经一步一步地详细分析了函数的工作原理,从初始条件开始,以构建完整序列结束。

这种方法可以在与数论相关的问题,特殊序列的生成,以及用于教育目的,以证明与数字及其属性的工作是有用的。

该示例是使用[罗塞塔代码]的材料开发的(https://rosettacode.org/wiki/Coprime_triplets