[useless]高斯整数学习笔记
背景
嫌字多不看?那笔者建议直接关掉网页打开B站:【3b1b】隐藏在素数规律中的π
考虑这样的不定方程:
给定 ,是否存在 满足 ?
若存在,有办法刻画出所有的解吗?
熟知——在复数域上 可以分解为 ,
没什么用的转化: 能否找到实部虚部均为整数的共轭复数,使得乘积为 ?
实际上这样的“复整数”有个名字叫高斯整数,有与整数相似的整除性质、可分解性质。
这是不是小学学的最大公约数啊?还真是
问题
笔者只知道3道,所以是useless。
什么?您一发A了?您慢走 Orz
为了方便地彻底解决以上问题,我们可以引入高斯整数的理论。
直接翻到后面看题解也行
高斯整数环上的整除理论
高斯整数(环)是啥
-
形如 ,其中 是整数的复数 称为高斯整数,全体高斯整数记为
-
可以做封闭的加法、减法、乘法(定义与复数域上的运算一致,满足基本运算律,也有相应的几何意义)
-
零元是
-
乘法单位元是 ,不妨将“任一单位元”记为
除特别说明,以下所有字母表示高斯整数
根据我们对整数理论的认识,带余除法是构建整除理论的基本工具,我们仍然希望在高斯整数环上定义带余除法,则可以寻求合适的“大小”定义,类比整数的绝对值
范数
对于
(1) 称 为 的范数(Norm),也记为
这使每个高斯整数都对应到了一个非负整数(但反之不行),但特别地,有:
(2)
实际上,这个性质在复数域上成立,当然在高斯整数环上成立
尽管定义范数用了“复数模长”的常用符号 ,应当注意范数应该是复数模长的平方
带余除法的定义
- 対 ,存在唯一的 满足 且
设 ,,利用熟知的复数除法
记 四舍五入的整数为 , 四舍五入的整数为
则 满足上述定义
(不严谨证明)考虑分离复数的实部与虚部的“整数部分“与”小数部分”:
记 ,
那么"整数部分"为 ,"小数部分"为
而
即
由封闭性知 ,且 ,再由整数性质得
注意上述定义的“四舍五入”,如果将其”改为“最近的整数”,则余数不唯一,但不影响后文所述结论
性质
与整数类似
根据带余除法,可以定义商(a/b=q
),余数(a%b=r
),整除(a%b==0
),约数与倍数等概念 和整数一样的所以懒得写了
从定义立即得:
(1)(设 )若 ,则 有 (倍数的线性组合仍是倍数)
(2)若 ,则 (这说明一个非0数的约数是有限的)
(3)若 ,则
称乘积上相差一个 的数是相伴的,
便于讨论,我们认为在相伴意义下 ,,, 都是同一个数。
(4)若 且 ,则 和 是相伴的
公约数
这里仿照整数的公约数性质列出了高斯整数的对应性质,
但笔者认为直接地证明以下结论并不容易,因为同一个范数可能对应不相伴的多个高斯整数。
比较容易操作的方法是先引入辗转相除法证明最大公约数的存在性和唯一性,以此为基础导出下面的性质。
- (公约数)对全不为 的高斯整数 ,若高斯整数 满足 ,则称 为 的公约数
- (最大公约数)上述 的公约数是非空有限的( 显然是公约数),称范数最大的公约数为最大公约数(假定最大公约数在相伴意义下唯一,实际上的确如此),记为
- (互素)若 ,称 互素
- (性质0)记 ,则 互素
- (性质1)最大公约数是所有公约数的倍数
- (性质2)
- (性质3)总存在高斯整数 使得
- (整除的性质5)设
-
- 若 ,则
-
- 若 ,则
辗转相除法
我们定义一种形式运算,使得它的结果恰满足上面两数最大公约数的定义
区别上面的定义,用 来形式地定义 :
对 ,递归地将定义 为一个满足如下条件的函数,
(0)
(1)存在 满足
(2);一般地,,此时令
(3)(对于其它一般情形)不妨设 且 ,作带余除法 ;
假设 已定义,令
不妨设
即
令
由于 ,因此这个“递归定义”会在有限步到达 的情况
这种定义同时给出了计算 (可以同时解出系数 )的算法,时间复杂度是类似的
(不严谨地将说明这两种公约数的引进方法的一致性)
如果记0的形式公约数为0,依次考察上述过程的(2)和(3),利用整除定义与性质知 满足公约数的性质1与性质3,且知此时 在相伴意义下是唯一满足这些性质的(若不引入形式约数0,只需考虑(2)的前驱状态,此时a和b一定有一个是另一个的约数,亦知 就是 )
归纳可知对于多个数(形式上允许其中出现0),,且满足前述公约数性质
素数
对于 的 ,根据其是否有非平凡约数来分为两类:
(合数)若存在 ,其中 ,称 为合数(可约数)
显然整数环上的合数也是 上的合数
(素数)若不存在上述表示,称 为素数(不可约数)
一般用 表示素数,可知 中的素数仍有“素性”:
- 对 ,要么 ,要么
(推论1)若 则 或
(推论2)若质数 和 满足 ,则在相伴意义下
(推论3)高斯整数中的素数与合数均有无穷多个
可以据已有的结果推出下面这个重要结果:
唯一分解定理
总有相伴意义下唯一的表示 ,其中 是不相伴的素数, 是非负整数。
容易通过穷举说明在 比较小时定理成立,实际上一般情形读者自证不难,建议自行思考下
(口胡的证明)
-
合数分解的存在性(质数分解当然只能是相伴意义下的自己)。
(反证)若不然,则可以取出不能表示为若干素数乘积的合数中范数最小的那个合数 ,根据定义 使得 且 ,但根据假设 和 是能表示为素数的乘积的,于是 当然也能表示为素数乘积,矛盾。 -
分解的唯一性。
(反证)仍然取其中范数最小的分解不唯一的数,假设 ,其中 和 是本质不同的素数可重集合(若为空集,则这个乘积的结果为,显然定理已经成立)。
由质数的性质,根据 得到 ,则 ,不妨设 ,
于是得到 ,由于 , 的分解是唯一的,这表明 与 是本质相同的,那 的这两种分解也是本质相同的,矛盾。
可见在高斯整数环上也可以有“积性”的说法,我们可以将一个普通的 分解成整数环上的正素数,再考虑这些整数环上的正素数能否在高斯整数环上继续分解。
注意到 ,只需考虑整数环上的奇素数,有如下的结果:
二平方和定理
这个性质可以不依赖高斯整数的定义,下面利用初等数论中“二次剩余”的知识证明
不了解二次剩余就上OIWIKI抄一份正确的模质数开根的代码
要求方程 的正整数解 ,其中 是给定奇质数,
- 若 ,无解(等号两边模4讨论即可)
- 若 ,存在唯一解(若考虑整数解,显然不能 或 ,因此算上 次序与正负就有四个整数解)
换句话说:
-
,这对素数相伴
-
“4k+3”型奇质数也是 上的素数
-
“4k+1”型奇质数是一对共轭素数的乘积,且这对素数不相伴
证明
和 的情况是显然的,但解决 的情况需要一些代数变形技巧
存在性
根据二次剩余的知识,方程 有整数解:
令 ,可以用 Cipolla算法 在 的期望时间求出对应的(最小正整数) ,且满足
这表明
- 存在整数 满足
我们已经有一组
需要根据 得到 满足 ,重复此过程直到
设
取最小绝对值余数
由于 不能均为 的倍数,有
即 , ,可得
将等号左边变形得
由 得
即 (说明每次调整, 的规模至少缩小一半)
显然 ,若 同时约分即可
- 综上,解的存在性得证,同时给出了一种寻找解的期望 算法
唯一性
(反证)假设 ,其中
用恒等式 得
记 ,即
由 ,得 ,又因为 是质数, 是正整数,则
又由 可知 三个数两两互质,即
- 两两互质
由对称性,且 得
- 两两互质
但另一方面
矛盾
4k+1型质数的分解算法
因为已经有了分解的存在性,实际上我们有代码实现上更加简单的分解算法。
设
根据二次剩余的知识,我们可以用 Cipolla算法 找到正整数 ,即
那么 就是 中的一个,它的共轭复数就是另一个
复杂度为期望
(正确性证明)
考虑 的素数分解,由唯一分解定理知,每个素约数的共轭复数都出现在 的素数分解中,且反之亦然(共轭后仍相伴的素数只有 的素约数 ,它显然不是 的约数)
这表明 与 这两个素数分别出现在 与 中
正整数 的平方分解数量
咕咕咕...等笔者学会min25筛再来更新
https://www.luogu.com.cn/blog/ILikeDuck/gao-si-zheng-shuo-yu-er-ci-sheng-yu
...end?
要在 上仿照整数环引入同余类似乎是可行的,不过太菜的笔者尚未做到过相关的习题(咕咕咕...
我们已经把整数平方和问题转化为复数分解问题,这就使得对于一般的 ,求解它的平方和分解的瓶颈在于对 进行质因数分解,当然,也许存在其它更好的问题转化也说不定。
问题题解
LOJ6465 分解4k+1型质数
典,注意可能的long long相乘溢出
luoguP2508(HAOI2008)圆上的整点
看这篇题解
题中给定三角形三边的向量可以表示为三个高斯整数 ()
不妨设 ,记
设它的相似三角形三边对应的高斯整数为
则需满足
即
即,则
可见应取 来使得相似三角形面积最小
参考代码
#include <bits/stdc++.h>
using namespace std;
struct G {
long long r, i;
G(long long re = 0, long long im = 0) : r(re), i(im) {}
long long norm() const { return r * r + i * i; }
G operator+(const G& b) const { return G(r + b.r, i + b.i); }
G operator-(const G& b) const { return G(r - b.r, i - b.i); }
G operator*(const G& b) const {
return G(r * b.r - i * b.i, i * b.r + r * b.i);
}
G operator/(const G& b) const {
long long l = b.norm();
return G(round(1.0 * (r * b.r + i * b.i) / l),
round(1.0 * (i * b.r - r * b.i) / l));
}
G operator%(const G& b) const { return (*this) - (*this) / b * b; }
void get() { scanf("%lld%lld", &r, &i); }
void write() const { printf("%lld %lld ", r, i); }
};
G gcd(G a, G b) { return (b.norm() == 0) ? a : gcd(b, a % b); }
void solve(int T) {
G a, b, c;
a.get(); b.get(); c.get();
a = a - c;
b = b - c;
G g = gcd(a, b);
a = a / g;
b = b / g;
a.write(); b.write(); puts("0 0");
}
signed main() {
int t;
scanf("%d", &t);
for (int i = 1; i <= t; ++i) solve(i);
return 0;
}
参考资料
潘承洞《初等数论》(整数环上的整除理论、不定方程)
北京大学数学系前代数小组编《高等代数(第五版)》,高等教育出版社(多项式环上的整除理论)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)