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
# almost prime 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) 
    # Создаем вектор для хранения результатов размером N типа k
    P = Vector{typeof(k)}(undef,N)
    # Инициализируем счетчик найденных чисел и текущее проверяемое число
    i = 0; n = 2
    # Цикл продолжается пока не найдем N чисел
    while i < N
        # Если текущее число является почти простыми порядка k
        if isalmostprime(n, k) 
            # Сохраняем его в массив результатов и увеличиваем счетчик
            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
    # Генерируем первые 10 почти простых чисел порядка k
    primes_k = almostprimes(10, k)
    # Преобразуем числа в строки и соединяем их запятыми
    result_str = join(primes_k, ", ")
    # Выводим результат в форматированном виде
    println("$k-почти простые: $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