0273 平方和数
* * * *
拉格朗日计划
* * * *
平方和数

考虑方程:$a^2+b^2=N$,其中$0\le a\le b$且$a,b,N$均为整数。

$N=65$时方程有两个解:$a=1, b=8$ 和$a=4, b=7$。

给定N,记所有的解中a值之和为$S(N)$,例如$S(65)=1+4=5$。

求$\sum S(N)$,其中$N$是只能被模4余1型且小于150的素数整除的无平方因子数。

本题难度:



解答

满足要求的素数共有16个,分别是5,13,17,29,37,41,53,61,73,89,97,101,109,113,137,149。

对每个这样的素数p,找出满足$a_p^2+b_p^2=p$的解$a_p,b_p$,本题中这样的解是唯一的。

利用公式 $$(a^2+b^2)(c^2+d^2)=(ac-bd)^2+(ad+bc)^2=(ac+bd)^2+(ad-bc)^2,$$ 即可使用深度优先搜索枚举这些素数的乘积并生成不同的解。最终结果是$2032447591196869022$。

注:计算量较大,代码中打印了进度信息。

primes=[5,13,17,29,37,41,53,61,73,89,97,101,109,113,137,149]
squares=[i*i for i in range(1,13)]
ap,bp=[],[]

for p in primes:
    for j,x in enumerate(squares):
        y=p-x
        if y in squares and 0 < x <= y:
            k=squares.index(y)
            ap.append(j+1)
            bp.append(k+1)

q=[(p,{(ap[i],bp[i])}) for i,p in enumerate(primes)]
checked=set(primes)
r=sum(ap)
k=16

while q:
    u,s=q.pop()
    for i in range(16):
        if u%primes[i]>0:
            c,d,v=ap[i],bp[i],u*primes[i]
            if v not in checked:
                checked.add(v)
                solutions=set()
                for a,b in s:
                    for x,y in ((abs(a*c-b*d),abs(a*d+b*c)),(abs(a*c+b*d),abs(a*d-b*c))):
                        if x>y:
                            x,y=y,x
                        if (x,y) not in solutions:
                            solutions.add((x,y))
                            r+=x
                q.append((v,solutions))
                k+=1
                if k%655==0:
                    print k/655,"percent completed"

print r