Engee 文档
Notebook

算术导数

这个例子演示了Julia编程语言中算术导数算法的实现和使用。

导言

算术导数是数学分析中通常的导数函数的类似物,但应用于整数。 有人提出在微分方面研究数字的性质,类似于导数如何应用于函数。 形式上,对于一个自然数 ,表示为 ,并定义如下:


  • -如果 -一个素数,那么
    -如果 然后 )

它允许您将微分微积分的直觉应用于数值序列,并用于解决数论中的一些问题。

此代码使用素因子分解实现此定义的递归版本。

算术导数函数的实现 D(n)

要使用检查简单性和保理的功能,您需要包'素数'

In [ ]:
import Pkg; Pkg.add("Primes")

using Primes
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
In [ ]:
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
Out[0]:
D (generic function with 1 method)

功能 D(n) 计算数字的算术导数 n. 下面是对其实现的详细分析。:

-负数的处理是通过带有符号变化的递归实现的。
-根据定义,数字0和1返回0。
-对于素数,返回1。
-分解用于复合数字 eachfactor(n) -我们得到对(素数,指数)。
-对于每个素数除数 带度指示器 让我们总结一下 ;结果转换为输入参数的类型。

因此,函数完全满足算术导数的形式定义。

计算算术导数

值的输出 对于从-99到100的格式化格式的范围

In [ ]:
foreach(p -> print(lpad(p[2], 5), p[1] % 10 == 0 ? "\n" : ""),
        pairs(map(D, -99:100)))
  -75  -77   -1 -272  -24  -49  -34  -96  -20 -123
   -1 -140  -32  -45  -22 -124   -1  -43 -108 -176
   -1  -71  -18  -80  -55  -39   -1 -156   -1  -59
  -26  -72   -1  -61  -18 -192  -51  -33   -1  -92
   -1  -31  -22  -92  -16  -81   -1  -56  -20  -45
  -14 -112   -1  -25  -39  -48   -1  -41   -1  -68
  -16  -21   -1  -60  -12  -19  -14  -80   -1  -31
   -1  -32  -27  -15  -10  -44   -1  -13  -10  -24
   -1  -21   -1  -32   -8   -9   -1  -16   -1   -7
   -6  -12   -1   -5   -1   -4   -1   -1    0    0
    0    1    1    4    1    5    1   12    6    7
    1   16    1    9    8   32    1   21    1   24
   10   13    1   44   10   15   27   32    1   31
    1   80   14   19   12   60    1   21   16   68
    1   41    1   48   39   25    1  112   14   45
   20   56    1   81   16   92   22   31    1   92
    1   33   51  192   18   61    1   72   26   59
    1  156    1   39   55   80   18   71    1  176
  108   43    1  124   22   45   32  140    1  123
   20   96   34   49   24  272    1   77   75  140

在这里,我们计算从-99到100范围内的所有整数的算术导数,以人类可读的形式显示它们。

专责小组 map(D, -99:100) 为间隔中的每个数字构建一个值数组。

功能 pairs(...) 创建index=>值对,以便可以跟踪行号。

foreach(...) 通过这些对并输出每个值 p[2],通过格式化 lpad 在5个字符的字段中。 如果对号可以被10整除(p[1] % 10 == 0),有一个过渡到一个新的行 \n.

这给了我们一个显示行为的表格 在短时间内。

十的派生幂的推导

下一个块计算并打印值 从1到20:

In [ ]:
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
D for 10^1   divided by 7 is 1
D for 10^2   divided by 7 is 20
D for 10^3   divided by 7 is 300
D for 10^4   divided by 7 is 4000
D for 10^5   divided by 7 is 50000
D for 10^6   divided by 7 is 600000
D for 10^7   divided by 7 is 7000000
D for 10^8   divided by 7 is 80000000
D for 10^9   divided by 7 is 900000000
D for 10^10  divided by 7 is 10000000000
D for 10^11  divided by 7 is 110000000000
D for 10^12  divided by 7 is 1200000000000
D for 10^13  divided by 7 is 13000000000000
D for 10^14  divided by 7 is 140000000000000
D for 10^15  divided by 7 is 1500000000000000
D for 10^16  divided by 7 is 16000000000000000
D for 10^17  divided by 7 is 170000000000000000
D for 10^18  divided by 7 is 1800000000000000000
D for 10^19  divided by 7 is 19000000000000000000
D for 10^20  divided by 7 is 200000000000000000000

注意:

-转换为 Int128:这是必要的,因为对于大的几十 10^m 有可能超越标准类型 Int.
-表达 D(Int128(10)^m) 计算数字的算术导数 10^m.
-整数除法运算 ÷ 它需要得到一个整数来获得一个漂亮的输出。

代码的这一部分显示了导数的行为如何改变十次幂。

结论

我们回顾了Julia语言中算术导数算法的实现和操作。

实现包括功能 D(n) 对应于整数的正式定义。 创建了一个小范围数字的导数值表,并分析了十次幂导数的行为。 这种方法可以帮助研究算术导数的性质,也显示了Julia在快速处理数论中的数值问题方面的力量。 该示例演示了数学定义中的精度和通过使用专门的包(在本例中)对大数进行高效工作的组合 — Primes). 还展示了可读地展示结果和处理极端案件的做法。

该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Arithmetic_derivative