JavaScript(ES7)、165バイト
@NeilA。の答えと同じように、これはTunnellの定理に基づいているため、BirchとSwinnerton-Dyerの推測が正しいと仮定しています。
ブール値を返します。
n=>(r=(g=i=>i<n?g(i+!(n%i**2?0:n/=i*i)):n**.5|0)(s=2),g=(C,k=r)=>k+r&&g(C,k-1,C(k*k)))(x=>g(y=>g(z=>s+=2*(n==(X=(n&1?2:8)*x+(o=2-n%2)*y)+o*32*z)-(n==X+o*8*z))))|s==2
オンラインでお試しください!
どうやって?
最初に入力を変換します n 正方形のない対応物に n′、計算 R = ⌊ N′−−√⌋ そして初期化する s に 2。
r = ( // we will eventually save isqrt(n) into r
g = i => // g = recursive function taking an integer i
i < n ? // if i is less than n:
g(i + !( // do a recursive call with either i or i + 1
n % i**2 ? // if n is not divisible by i²:
0 // yield 0 and therefore increment i
: // else:
n /= i * i // divide n by i² and leave i unchanged
)) // end of recursive call
: // else:
n ** .5 | 0 // stop recursion and return isqrt(n)
)(s = 2) // initial call to g with i = s = 2
次に、ヘルパー関数を定義します g コールバック関数を呼び出します C と k2 ために - R < K ≤ R。
g = (C, k = r) => // C = callback function, k = counter initialized to r
k + r && // if k is not equal to -r:
g( // do a recursive call:
C, // pass the callback function unchanged
k - 1, // decrement k
C(k * k) // invoke the callback function with k²
) // end of recursive call
最後に、ネストされた3つの呼び出しを使用して g すべてのトリプレットを歩く (x 、y、z)∈ [ − r + 1 、r ]3 そして更新 s かどうかをテストする 2 An= Bn もし n 奇数または 2 Cn=Dn if n is even, with:
An=#{(x,y,z)∈[−r+1,r]3∣n=2x2+y2+32z2}Bn=#{(x,y,z)∈[−r+1,r]3∣n=2x2+y2+8z2}Cn=#{(x,y,z)∈[−r+1,r]3∣n=8x2+2y2+64z2}Dn=#{(x,y,z)∈[−r+1,r]3∣n=8x2+2y2+16z2}
g(x => // for each x: \ NB:
g(y => // for each y: >-- all these values are
g(z => // for each z: / already squared by g
s += // add to s:
2 * ( // +2 if:
n == ( // n is equal to either
X = // An if n is odd (o = 1)
(n & 1 ? 2 : 8) * x + // or Cn if n is even (o = 2)
(o = 2 - n % 2) * y //
) + o * 32 * z //
) - ( // -1 if:
n == X + o * 8 * z // n is equal to either
) // Bn if n is odd
) // or Dn if n is even
) //
) // if s in unchanged, then n is (assumed to be) congruent