Freshman's dream

\((x+y)^n=x^n+y^n\)。我们知道这是错误的,但很多初学者经常犯这样的错误。

然而这在 \(\bmod n\)\(n\) 为素数)下是正确的。在 Cipolla 算法和 AKS 算法里用到了这一点。

平方和

任何 \(\equiv1\pmod4\) 的素数 \(p\) 都可以被写成 \(a^2+b^2\)\(a,b\) 为正整数)的形式。

算法:

  1. 找到 \(a\equiv\sqrt{-1}\pmod p\)。设置 \(b=1\)
  2. 重复以下步骤,直到 \(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\)
  1. 输出 \(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} \]

这样就是一个椭圆曲线了。