Арифметическая производная
Арифметическая производная
Этот пример демонстрирует реализацию и использование алгоритма арифметической производной на языке программирования Julia.
Введение
Арифметическая производная — это аналог обычной функции производной из математического анализа, но применяемый к целым числам. Она была предложена для изучения свойств чисел с точки зрения дифференцирования, подобно тому, как производные применяются к функциям. Формально, для натурального числа , обозначается , и определяется следующим образом:
- Если – простое число, то
- Если , то )
Она позволяет применять интуицию из дифференциального исчисления к числовым последовательностям и используется при решении некоторых задач теории чисел.
В этом коде реализуется рекурсивная версия такого определения с использованием разложения числа на простые множители.
Реализация функции арифметической производной D(n)
Для использования функции проверки на простоту и разложения на множители нужен пакет 'Primes'
import Pkg; Pkg.add("Primes")
using Primes
function D(n)
# Если число отрицательное, вызываем D(-n) и меняем знак результата
n < 0 && return -D(-n)
# Для 0 и 1 значение D всегда равно 0
n < 2 && return zero(n)
# Если число простое, то его производная равна 1
isprime(n) && return one(n)
# Если число составное, используем формулу:
# D(n) = Σ (e_i * n / p_i), где p_i -- простые множители, e_i -- их степени в разложении
return typeof(n)(sum(e * n ÷ p for (p, e) in eachfactor(n)))
end
Функция D(n)
вычисляет арифметическую производную числа n
. Ниже приведён подробный анализ её реализации:
- Обработка отрицательных чисел реализована через рекурсию с изменением знака.
- Числа 0 и 1 возвращают 0, согласно определению.
- Для простых чисел возвращается 1.
- Для составных чисел используется разложение
eachfactor(n)
— получаем пары (prime, exponent). - Для каждого простого делителя c показателем степени суммируем ; результат приводится к типу входного аргумента.
Таким образом, функция полностью удовлетворяет формальному определению арифметической производной.
Вычисление арифметической производной
Вывод значений для диапазона от -99 до 100 в форматированном виде
foreach(p -> print(lpad(p[2], 5), p[1] % 10 == 0 ? "\n" : ""),
pairs(map(D, -99:100)))
Здесь мы вычисляем арифметические производные всех целых чисел в диапазоне от -99 до 100, отображая их в удобочитаемом виде.
Команда map(D, -99:100)
строит массив значений для каждого числа из интервала.
Функция pairs(...)
создаёт пары индекс => значение, чтобы можно было отслеживать номер строки.
foreach(...)
проходит по этим парам и выводит каждое значение p[2]
, отформатированное через lpad
в поле из 5 символов. Если номер пары делится на 10 (p[1] % 10 == 0
), происходит переход на новую строку \n
.
Это даёт нам таблицу, показывающую поведение в небольшом интервале.
Вывод производных степеней десятки
Следующий блок рассчитывает и печатает значения для от 1 до 20:
for m in 1:20
result = D(Int128(10)^m) ÷ 7 # Вычисление D(10^m), затем деление на 7
println("D for 10^$(rpad(m, 3)) divided by 7 is $result")
end
Обратите внимание на:
- Преобразование в
Int128
: необходимо потому, что при больших степенях десятки10^m
возможен выход за пределы стандартного типаInt
. - Выражение
D(Int128(10)^m)
рассчитывает арифметическую производную числа10^m
. - Операция целочисленного деления
÷
нужна, чтобы получить целое число для красивого вывода.
Эта часть кода показывает, как поведение производной меняется для степеней десятки.
Заключение
Мы рассмотрели реализацию и работу алгоритма арифметической производной на языке Julia.
Реализация включает функцию D(n)
, соответствующую формальному определению для целых чисел. Была создана таблица значений производной для небольшого диапазона чисел, и проведен анализ поведения производной для степеней десятки. Такой подход может помочь в исследовании свойств арифметических производных, а также показывает мощь Julia в быстрой работе с числовыми задачами из теории чисел. Пример демонстрирует сочетание точности математических определений и эффективной работы с большими числами благодаря использованию специализированных пакетов (в данном случае — Primes
). Также была показана практика читаемого представления результатов и обработки крайних случаев.
Пример разработан с использованием материалов Rosetta Code