Freshman's dream
\((x+y)^n=x^n+y^n\)。我们知道这是错误的,但很多初学者经常犯这样的错误。
然而这在 \(\bmod n\)(\(n\) 为素数)下是正确的。在 Cipolla 算法和 AKS 算法里用到了这一点。
平方和
任何 \(\equiv1\pmod4\) 的素数 \(p\) 都可以被写成 \(a^2+b^2\)(\(a,b\) 为正整数)的形式。
算法:
- 找到 \(a\equiv\sqrt{-1}\pmod p\)。设置 \(b=1\)。
- 重复以下步骤,直到 \(a^2+b^2=p\):
- 计算 \(k=\frac{a^2+b^2}p\)。
- 计算 \(c=a\bmod k,d=b\bmod k\)。限制 \(c,d\) 在 \([-\frac k2,\frac k2]\) 内。
- 计算 \(e=\frac{ac+bd}k,f=\frac{ad-bc}k\)。
- 设置 \(a=e,b=f\)。
- 输出 \(a,b\)。他们是唯一解。
def findsqr(p):
a = int(sqrt(mod(-1,p)))
b = 1
k = (a^2 + b^2) // p
while k != 1:
while k % 4 == 0:
a = a / 2
b = b / 2
k /= 4
if k % 2 == 0:
[a, b] = [(a + b) / 2, abs(b - a) / 2]
k /= 2
c = a % k
d = b % k
if c > k - c: c = c - k
if d > k - d: d = d - k
e = (a*c+b*d)//k
f = (a*d-b*c)//k
a = e
b = f
k = (a^2 + b^2) // p
return [abs(a), abs(b)]
上方代码的第二行可能需要额外实现二次剩余算法。
在 Sagemath 中,two_squares 函数可以用于解决该问题。
如果 \(p\equiv3\bmod 4\),则需要另外的算法。将上述 \((a+bi)(c+di)\) 过程换成四元数乘法并将 \(k\equiv0\pmod4\) 的情形稍作修改即可。
有理直角三角形
找到满足下列条件的正有理数 \(a,b\):
- \(\sqrt{a^2+b^2}\in\mathbb{Q}\)
- \(ab=2n\)
这个问题等价于求出 \(y^2=x^3-n^2x\) 上的有理数点:假设 \((x,y)\) 是这上面的一个点(不同于 \((n,0)(0,0)(-n,0)\)),那么设置 \(a=\frac{x^2-n^2}y,b=\frac{2xn}{y}\) 可以得到
\[\begin{aligned}
a^2+b^2&=(\frac{x^2+n^2}y)^2\\
ab&=\frac{2xn(x^2-n^2)}{y^2}\\
&=\frac{2xn(x^2-n^2)}{x(x^2-n^2)}\\
&=2n
\end{aligned}
\]
三次方和
这是 Thue 方程之一。可以使用 thue 高效解决。也可以选择除以立方因子之后使用下述方法。
三次方和(有理数)
假设我们要解 \(x^3+y^3=n\)。进行换元(\(p=\frac{x+y}2,q=\frac{x-y}2,u=\frac{36nq}p=\frac{36n(x-y)}{x+y},v=\frac{6n}p=\frac{12n}{(x+y)}\)):
\[\begin{aligned}
x^3+y^3&=n\\
(p+q)^3+(p-q)^3&=n\\
2p^3+6pq^2&=n\\
2+6(\frac qp)^2&=\frac{n}{p^3}\\
6(\frac qp)^2&=n(\frac1p)^3-2\\
(\frac{n\times36q}p)^2&=(\frac{n\times6}p)^3-2\times n^2\times6^3\\
u^2&=v^3-432n^2
\end{aligned}
\]
这样就是一个椭圆曲线了。
浙公网安备 33010602011771号