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