GPT秒了.

User

1
2
3
4
5
6
7
8
9
10
11
12
13
数的超幂

数a的正整数b次超幂或迭代幂次,记作a↑↑b或ba,按照如下方式递归定义:

a↑↑1 = a,
a↑↑(k+1) = a^(a↑↑k).

举例来说,3↑↑2 = 3^3 = 27,因此3↑↑3 = 3^{27} = 7625597484987,而3↑↑4约为10^{3.6383346400240996*10^{12}}。

求1777↑↑1855的最后8位数字。
我的思路:
不停的使用欧拉定理,对mod取很多次mod,直到phi变成1为止,使用快速幂递归处理即可.
模数很小,可以暴力求欧拉函数.

GPT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
好 —— 我算过了,结论是:

**1777↑↑1855 的最后 8 位是 `95962097`。**

下面把用到的算法思路与关键细节简要说明(中文):

1. 记要算的数为 (A_1=1777),高度为 (H=1855),即
[
A_H = \underbrace{1777^{1777^{\cdot^{\cdot^{1777}}}}}_{\text{高度 }1855}.
]
我们要算 (A_H \bmod 10^8)。

2. 令 (m_0=10^8),对模 (m) 使用 Euler 函数 (\varphi(m)) 构造模链
(m_0,m_1=\varphi(m_0),m_2=\varphi(m_1),\dots) 直到到达 (1)。
对 (10^8) 这条链为: (100000000,40000000,16000000,\dots,2,1)(长度远小于 1855)。

3. 递归地从上往下计算(高度减小时把模换成 (\varphi(\cdot))):

* 若当前模 (m=1),则任何数模 (1) 为 (0);
* 若高度为 1,直接取 (1777 \bmod m);
* 否则先递归得到指数 (E) 关于模 (\varphi(m)) 的“模值”和一个标记 `is_large`(表示真实的指数是否至少 (\varphi(m)))。

* 若真实指数 (\ge \varphi(m)),按欧拉定理需把指数缩减为 (E_{\bmod\varphi(m)}+\varphi(m))(即在模 (\varphi(m)) 的余数上加上 (\varphi(m)))再作为幂的指数;
* 否则直接用真实的指数(即 (\ <\varphi(m)) 的小整数)计算幂的模。
这个标记 `is_large` 能通过递归向下的比较(或者用对数判断 (a^E) 是否已超过当前模)来可靠得到。

4. 由于底数 (1777) 与 (10^8) 互质,上述通过 (\varphi) 链进行的“模化并在必要时加上 (\varphi)”的做法是正确且充足的。

我用上述方法(同时在递归中用对数判断小指数是否足以使 (a^E\ge m))实现并计算,得到最终结果 `95962097`(恰好 8 位)。

如果你想,我可以把用于验证与计算的 Python 实现贴出来,或者一步步展示模链与部分中间值供你检查。要看代码吗?

fun fact

GPT内置agent有py,但是ds没有,导致ds往往预测输出的时候全在瞎说,gpt会好一点.