算术导数
这个例子演示了Julia编程语言中算术导数算法的实现和使用。
导言
算术导数是数学分析中通常的导数函数的类似物,但应用于整数。 有人提出在微分方面研究数字的性质,类似于导数如何应用于函数。 形式上,对于一个自然数 ,表示为 ,并定义如下:
 -如果 -一个素数,那么
 -如果 然后 )
它允许您将微分微积分的直觉应用于数值序列,并用于解决数论中的一些问题。
此代码使用素因子分解实现此定义的递归版本。
算术导数函数的实现 D(n)
要使用检查简单性和保理的功能,您需要包'素数'
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) -我们得到对(素数,指数)。
-对于每个素数除数  带度指示器  让我们总结一下 ;结果转换为输入参数的类型。
因此,函数完全满足算术导数的形式定义。
计算算术导数
值的输出 对于从-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(...) 创建index=>值对,以便可以跟踪行号。
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代码]的材料开发的(https://rosettacode.org/wiki/Arithmetic_derivative )