前言
最近遇到了一道数学神题,是魔改的[HAOI2008]圆上的整点,我根本无从下手。
这道原题我是见过的,但当时以为高斯素数什么的应该基本不会考,故没去搞懂它。这道魔改题相当于是在原题基础上加了Min_25筛的进阶。
这两道题里面的一些结论很经典,而且是和我们熟知的勾股数相关的,所以我简单地讲讲。
(By the way,魔改者是陈YX)
upd:搞错顺序了,应该先是徐YX在论文里把原题改成前缀和引出Min_25筛,再被陈YX二次魔改
从问题入手
给定 n n n,求以原点为圆心、半径为 n n n 的圆上有多少个整点。
由于对称性,我们可以只求第一象限加 x 轴正半轴上的整点数然后乘以4,所以我们相当于要求满足 a 2 + b 2 = n 2 ( a > 0 , b ≥ 0 ) a^2+b^2=n^2\,(a>0,b\ge 0) a2+b2=n2(a>0,b≥0) 的平面上点 ( a , b ) (a,b) (a,b) 的数量。
这个 a 2 + b 2 a^2+b^2 a2+b2 除了向量的模长,我们还可以怎么翻译呢?如果把一个向量表示到复数域内,那么模长就等于 z ⋅ z ˉ z\cdot \bar{z} z⋅zˉ,也就是 ( a + b i ) ( a − b i ) (a+bi)(a-bi) (a+bi)(a−bi)。我们把这种 a a a 和 b b b 都为整数的复数称为高斯整数(注意高斯整数不是整数是复数)。
于是问题就转化为把 n 2 n^2 n2 分解成 ( a + b i ) ( a − b i ) (a+bi)(a-bi) (a+bi)(a−bi) 即两个共轭高斯整数的方案数。
高斯素数
如果我们是求一个整数分解成两个整数相乘的方案的话,显然需要先把它质因数分解。这里我们可不可以也把 n n n 给分解成若干个不可分解的高斯整数相乘呢?
把一个数在高斯整数域上分解为若干个复数因子的乘积,这种分解式是唯一的,而其中每个因子在高斯整数上不能再分,这些因子也就是高斯素数。
比如 5 = ( 2 + i ) ( 2 − i ) 5=(2+i)(2-i) 5=(2+i)(2−i),而 2 + i 2+i 2+i 就不能再分了,所以 2 + i 2+i 2+i 是一个高斯素数。
你还需要注意到,把两个复数同时乘以-1,或一个乘以 i i i 一个乘以 − i -i −i 时原式都是成立的。
显然某些素数不像5一样,不能分解成共轭复数的乘积,那么这些素数同时也是高斯素数。而合数一定不是高斯素数,因为它可以分解为整数的乘积。可见高斯素数和整数素数关联非常大。
所以我们不妨先把 n n n 做质因数分解,分解为素数的乘积,再把可以分解为高斯素数的素数分解。
费马平方和
哪些素数可以分解为高斯素数呢?
这里要用到费马平方和定理:
奇素数 p p p 可以表示为两个正整数的平方和,当且仅当 p p p 是 4 k + 1 4k+1 4k+1 型的。并且在不考虑两个正整数顺序的情况下,这个表示方法唯一。
也就是说,当我们把所有素数分为3类: 2 2 2、 4 k + 1 4k+1 4k+1、 4 k + 3 4k+3 4k+3 时,任意一个 4 k + 1 4k+1 4k+1 型的素数都可以被唯一分解为 z ⋅ z ˉ z\cdot \bar{z} z⋅zˉ,而所有 4 k + 3 4k+3 4k+3 型素数则不能被分解。特别地,我们会发现 2 = ( 1 + i ) ( 1 − i ) 2=(1+i)(1-i) 2=(1+i)(1−i),也就是说 2 也不是高斯素数。
初步结论
对于一个数
n
n
n,我们可以把它质因数分解成如下形式:
n
=
2
a
∏
p
i
m
o
d
4
=
1
p
i
b
i
∏
q
j
m
o
d
4
=
3
q
j
c
j
n=2^a∏_{p_i\bmod 4=1}p_i^{b_i}∏_{q_j\bmod 4=3}q_j^{c_j}
n=2apimod4=1∏pibiqjmod4=3∏qjcj
已知每个
p
i
p_i
pi 可以分解为
z
i
⋅
z
i
ˉ
z_i\cdot \bar{z_i}
zi⋅ziˉ,我们现在要求把
n
n
n 分解为共轭复数乘积的方案数,可以分别考虑这三部分的贡献:
-
4
k
+
3
4k+3
4k+3 型素数的贡献
由于它不能被分解为共轭复数的乘积,所以只能以唯一一种方式对半分到共轭两边。这个时候如果存在一个因子 q j c j q_j^{c_j} qjcj 的 c j c_j cj 不是偶数,那么直接完蛋,方案数为0。 -
4
k
+
1
4k+1
4k+1 型的贡献
对于一个素数 p i p_i pi,它可以分解为 z i z_i zi 和 z i ˉ \bar{z_i} ziˉ。我们把 z i z_i zi 和 z i ˉ \bar{z_i} ziˉ 分到共轭两边,共有两种方案。
更进一步,对于 p i b i p_i^{b_i} pibi,我们可以把 0 ∼ b i 0\sim b_i 0∼bi 个 z i z_i zi 分到一边,其余分到另一边, z i ˉ \bar{z_i} ziˉ 对称分,那么就有 b i + 1 b_i+1 bi+1种方案。所以说一个 p i b i p_i^{b_i} pibi 对答案的贡献为 b i + 1 b_i+1 bi+1。
当然,我们可以注意到共轭两边交换过后等价,所以最终方案数貌似要除以2,但是别忘了,
“在不考虑两个正整数顺序的情况下,这个表示方法唯一。”
而除了 1 ± i 1±i 1±i 以外所有高斯素数的 a a a 和 b b b 都是不同的,所以我们并没有考虑最终方案可以把 a , b a,b a,b 交换。也就是说,最终方案还要乘以2,抵消。 - 2 的贡献
由于一个 2 可以分解为 ( 1 + i ) ( 1 − i ) (1+i)(1-i) (1+i)(1−i),所以我们肯定要把 ( 1 + i ) (1+i) (1+i) 乘到一边,把 ( 1 − i ) (1-i) (1−i) 乘到另一边。但是有趣的一点是, ( 1 + i ) (1+i) (1+i) 和 ( 1 − i ) (1-i) (1−i) 的夹角为90°,所以两个方案会被计重。
为什么呢?
假设共轭两部分为 ( a + b i ) ( a − b i ) (a+bi)(a-bi) (a+bi)(a−bi),两个方案分别为 [ ( a + b ) + ( a − b ) i ] [ ( a + b ) − ( a − b ) i ] [(a+b)+(a-b)i][(a+b)-(a-b)i] [(a+b)+(a−b)i][(a+b)−(a−b)i] 和 [ ( a − b ) + ( a + b ) i ] [ ( a − b ) − ( a + b ) i ] [(a-b)+(a+b)i][(a-b)-(a+b)i] [(a−b)+(a+b)i][(a−b)−(a+b)i],容易发现这就是把 ( a + b ) (a+b) (a+b) 和 ( a − b ) (a-b) (a−b) 交换的结果,这个在前面已经讨论过了,所以算同一种方案。
由此得出,2 不应产生任何贡献。
综上,我们把所有贡献乘起来可以得到方案数为:
4
⋅
∏
(
b
i
+
1
)
[
所
有
c
j
为
偶
数
]
4\cdot ∏(b_i+1)\,\,[所有c_j为偶数]
4⋅∏(bi+1)[所有cj为偶数]
回到原题
原题要求的并不是
n
n
n 的分解而是
n
2
n^2
n2 的分解,
n
2
=
2
2
a
∏
p
i
m
o
d
4
=
1
p
i
2
b
i
∏
q
j
m
o
d
4
=
3
q
j
2
c
j
n^2=2^{2a}∏_{p_i\bmod 4=1}p_i^{2b_i}∏_{q_j\bmod 4=3}q_j^{2c_j}
n2=22apimod4=1∏pi2biqjmod4=3∏qj2cj
这样其实更方便了,因为
2
c
j
2c_j
2cj 都是偶数,不用考虑提前西内的情况。总方案数为
4
⋅
∏
(
2
b
i
+
1
)
4\cdot ∏(2b_i+1)
4⋅∏(2bi+1)
对于这道原题来说,用一次质因数分解就可以了。
更进一步
我们设 f ( n ) = ∏ ( 2 b i + 1 ) f(n)=∏(2b_i+1) f(n)=∏(2bi+1),那么根据定义发现,这个函数是个积性函数,是可以欧拉筛的。
若 n ≤ 1 0 7 n\le 10^7 n≤107,我们可以进行一次欧拉筛解决以下问题
- 求所有半径 ≤ n \le n ≤n 的圆上整点数量的和。
- 求所有半径 ≤ n \le n ≤n 的圆中,圆上整点数量恰好 m m m 个的圆有多少。
那如果 n ≤ 1 0 11 n\le 10^{11} n≤1011 呢?
第一个问题,就是求该函数的前缀和,可以用Min_25筛或州阁筛,详见国集2019论文,反正我是不会的。
第二个问题,就是我最开始提到的数学神题,这需要请教数学真的很厉害的巨佬们,我也是不会的。