두 제곱의 합을 계산


45

음수가 아닌 숫자가 주어지면 두 제곱 정수의 합 n으로 표현할 수있는 방법의 수를 출력하십시오 ( OEIS A004018 ). 참고 것을 및 긍정적, 부정적, 또는 제로, 및 순서 문제가 될 수 있습니다. 가장 적은 바이트가 이깁니다.nn == a^2 + b^2ab

예를 들어, n=25부여합니다 12때문에 25다음과 같이 표현 될 수있다

(5)^2  + (0)^2
(4)^2  + (3)^2
(3)^2  + (4)^2
(0)^2  + (5)^2
(-3)^2 + (4)^2
(-4)^2 + (3)^2
(-5)^2 + (0)^2
(-4)^2 + (-3)^2
(-3)^2 + (-4)^2
(0)^2  + (-5)^2
(3)^2  + (-4)^2
(4)^2  + (-3)^2

최대 값은 다음과 같습니다 n=25. 코드가 작동하도록주의하십시오 n=0.

0 1
1 4
2 4
3 0
4 4
5 8
6 0
7 0
8 4
9 4
10 8
11 0
12 0
13 8
14 0
15 0
16 4
17 8
18 4
19 0
20 8
21 0
22 0
23 0
24 0
25 12

다음은 n=100목록 까지의 값 입니다.

[1, 4, 4, 0, 4, 8, 0, 0, 4, 4, 8, 0, 0, 8, 0, 0, 4, 8, 4, 0, 8, 0, 0, 0, 0, 12, 8, 0, 0, 8, 0, 0, 4, 0, 8, 0, 4, 8, 0, 0, 8, 8, 0, 0, 0, 8, 0, 0, 0, 4, 12, 0, 8, 8, 0, 0, 0, 0, 8, 0, 0, 8, 0, 0, 4, 16, 0, 0, 8, 0, 0, 0, 4, 8, 8, 0, 0, 0, 0, 0, 8, 4, 8, 0, 0, 16, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 8, 4, 0, 12]

재미있는 사실 :이 시퀀스에는 임의로 높은 항이 포함되어 있으며, 실행 평균의 한계는 π입니다.

리더 보드 :


4
무엇을 기다립니다?? "시퀀스에는 임의로 높은 항이 포함되어 있으며, 실행 평균의 한계는 π입니다."
Stewie Griffin

@StewieGriffin 두 문장은 일관성이 있습니다. 순서를 고려하십시오 1,0,2,0,0,3,0,0,0,4,0,0,0,0,5,.... 0이 아닌 숫자 후에 시퀀스를 자르면 지금까지의 평균은 1입니다. 그리고 0의 런은 시퀀스에서 나중에 영향이 적습니다.
xnor

5
나는 그것이 일관성이 있다는 것을 알고있다. 내가 얻지 못하는 것은 : 왜 지구상에서 Pi와 같습니까?
Stewie Griffin 12

29
@StewieGriffin N까지의 항의 합계는 a ^ 2 + b ^ 2 <= N 인 점 (a, b)에 해당합니다. 이들은 반경 sqrt (N)의 원에있는 격자 점이며 면적은 πN입니다.
xnor

2
@xnor 그리고 마술이 간다 :(
Andras Deak

답변:


19

파이썬 ( 59 57 56 바이트)

lambda n:0**n+sum((-(n%(x-~x)<1))**x*4for x in range(n))

온라인 데모

내 CJam 답변과 마찬가지로 Möbius 역전을 사용하고 의사 준 선형 시간으로 실행됩니다.

덕분에 SP3000 2 바이트 '절감 및 feersum 1.


1
그 괄호는 성가시다.
lirtosiast

@ThomasKwa, 그것에 대해 알려주세요. 내가 게시 한 첫 번째 버전으로가는 도중에 통과 한 버전 중 하나에서 저를 놀라게 한 -1**x것은 항상 그렇습니다 -1. 나는 -1우선 순위가 낮은 단항 빼기 대신 하나의 정수 리터럴 토큰이되기를 기대했습니다 .
피터 테일러

2
현상금을 축하합니다! 귀하의 코드는 내가 생각해 낸 것보다 짧습니다. 귀하의 솔루션은 완전히 새롭고 예상치 못한 수학적 아이디어를 기반으로하며, 똑같이 보이는 도전에도 불구하고 이것이 가능하다는 것을 기쁘게 생각합니다. 자기.
xnor

곱셈을 4 씩 움직여서 1 바이트를 절약 할 수 있습니다 **x.
feersum

@PeterTaylor 알고리즘이 어떻게 작동하는지 자세히 설명해 주시겠습니까? 나는 당신이 얼마나 많은 수의 suqares 문제에 뫼비우스 역전을 적용 할 수 있는지 알 수 없습니다.
flawr

15

Mathematica, 13 바이트

내장이 허용되는 경우 Mathematica에서이를 수행하는 방법입니다.

2~SquaresR~#&

0 <= n <= 100의 경우

2~SquaresR~# & /@ Range[0, 100]

{1, 4, 4, 0, 4, 8, 0, 0, 4, 4, 8, 0, 0, 8, 0, 0, 4, 8, 4, 0, 8, 0, 0, 0, 0 , 12, 8, 0, 0, 8, 0, 0, 4, 0, 8, 0, 4, 8, 0, 0, 8, 8, 0, 0, 0, 8, 0, 0, 0, 4 , 12, 0, 8, 8, 0, 0, 0, 0, 8, 0, 0, 8, 0, 0, 4, 16, 0, 0, 8, 0, 0, 0, 4, 8, 8 , 0, 0, 0, 0, 0, 8, 4, 8, 0, 0, 16, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 8, 4, 0 , 12}


1
물론 Mathematica는이를 위해 내장되어 있습니다.
HyperNeutrino

14

파이썬 2, 44 바이트

f=lambda n,x=1:+(x>n)or(n%x<1)-f(n,x+2)/4<<2

이것은 Peter Taylor의 솔루션을 기반으로하는 xsot 솔루션 과 거의 동일 하지만 부호 처리 방식을 단순화하여 8 바이트를 절약합니다.

전체 프로그램의 경우 함수 외부에서 비용을 발생시키지 않고 함수에서 2 바이트를 절약 할 수 있습니다.

f=lambda n,x=1:x>n or(n%x<1)-f(n,x+2)/4<<2
print+f(input())

이 방법으로 전체 프로그램을위한 두 개의 추가 바이트 :

n=input()
f=lambda x:x>n or(n%x<1)-f(x+2)/4<<2
print+f(1)

내용은 n > 0아주 읽기 쉬운 40 바이트 솔루션이 있습니다 :

f=lambda n,x=1:n/x and(n%x<1)*4-f(n,x+2)

1
현상금을 수상한 것을 축하합니다! 재귀 빼기는 제수 자체에서 부호를 추출 할 필요없이 홀수 제수에 대한 교호 합을 표현하는 깨끗하고 짧은 방법입니다. 또한 Peter Taylor의 솔루션을 재귀 적으로 n = 0으로 처리하는 재귀 솔루션으로 간소화 한 xsot의 공로입니다.
xnor December

12

Pyth, 13 바이트

/sM^^R2}_QQ2Q

테스트 스위트

/sM^^R2}_QQ2Q
                 Q = eval(input())
       }_QQ      Inclusive range from -Q to Q (all possible a and b)
    ^R2          Map to their squares
   ^       2     Form all pairs
 sM              Sum pairs
/           Q    Count occurances of Q

늦었지만, 나는 당신이 마지막이 필요하다고 생각하지 않습니다 Q.
Outgolfer Erik

12

J, 16 바이트

+/@,@:=+&*:/~@i:

이것은 모나 딕 동사입니다 (즉, 단항 함수). 온라인으로 시도 하거나 모든 테스트 사례를 통과했는지 확인하십시오 .

설명

+/@,@:=+&*:/~@i:  Denote input by n
              i:  The array of integers from -n to n
           /~@    Take outer product wrt the following function:
       +           the sum of
        &*:        squares of both inputs
                  This results in a 2D array of a^2+b^2 for all a, b between -n and n
      =           Replace by 1 those entries that are equal to n, and others by 0
   ,@:            Flatten the binary matrix
+/@               Take its sum

11

파이썬 2, 69 55 53 52 바이트

f=lambda n,x=1:+(x>n)or(2-x%4)*(n%x<1)+f(n,x+2)/4<<2

Peter Taylor의 탁월한 솔루션을 기반으로하는 재귀 함수 입니다.


1
이것은 큰 개선입니다. 그러나 더 짧게 만드는 방법이 여전히 있으므로 찾아 보시기 바랍니다.
xnor

1
@xnor 또 다른 바이트 다운. 더 이상 소매업을하지 않기를 바랍니다.
xsot

2
나는 그것에 대한 대답을 해야할지 모르겠다. 그것은 당신의 해결책과 하나의 트릭 f=lambda n,x=1:+(x>n)or(n%x<1)-f(n,x+2)/4<<2입니다. 또한 기본 최대 재귀 깊이를 초과하지 않아도됩니다.
Mitch Schwartz

1
@MitchSchwartz 나는 그것이 현상금에 걸 맞는 놀라운 개선이며 아마도 최종 최적화 xnor가 염두에 두었을 것이라고 생각합니다.
xsot

1
@MitchSchwartz 예, 이것이 제가 생각한 최적화입니다! 그리고 xsot의 /4<<2트릭은 내가 가진 것보다 짧게 만듭니다.
xnor

8

줄리아, 40 바이트

n->n>0?4sum(i->(n-i^2)^.5%1==0,1:n^.5):1

언 골프 드 :

function f(n)
  if n==0
    return 1           # Handle special case of n=0
  else
    m=0                # Start the counter at zero
    for i=1:sqrt(n)    # Loop over the values (i) whose squares are
                       # less than n (except zero)
      k=sqrt(n-i^2)    # Find k such that n=k^2+i^2
      if k==floor(k)   # if k is an integer, we've found a pair
        m+=4           # Add one for each of k^2+i^2, (-k)^2+(-i)^2, and the other two
      end
    end
    return m           # Return the resulting count
  end
end

루프가 포함되어 있지 않습니다 i==0때 때문에, n정사각형, 이미가 포함되어있어 i=sqrt(n), 그 양식, 네 개의하지 팔이있다 ( 0^2+k^2, 0^2+(-k)^2, k^2+0^2, (-k)^2+0^2).


7

CJam, 25 23 바이트

Zri:R#Ym*{Rf-Yf#:+R=},,

이것은 입력 n에 O (9 n ) 시간과 메모리 가 필요한 이론적 솔루션입니다 .

1 바이트의 추가 비용 (총 24 바이트)으로 복잡성을 O (n 2 ) 로 줄일 수 있습니다 .

ri:R)Y*Ym*{Rf-Yf#:+R=},,

온라인으로 사용해보십시오!

작동 원리

어느 한 쪽

Z                  Push 3.
 ri:R              Read an integer from STDIN and save it in R.
     #             Compute 3**R.

또는

ri:R               Read an integer from STDIN and save it in R.
    )Y*            Add 1 and multiply by 2.

그때

Ym*                Take the second Cartesian power, i.e., compute all pairs.
   {          },   Filter the pairs:
    Rf-              Subtract R from each.
       Yf#           Square the differences.
          :+         Add the squares.
            R=       Compare with R.
                   If = pushed 1, keep the pair.
                ,  Count the kept pairs.

그리고 1 바이트를 절약하면 복잡성을 Õ (n)으로 줄일 수 있습니다.
Peter Taylor

응, 나 봤어. 그 놀라운.
Dennis

7

CJam ( 25 24 22 21 바이트)

{:X!X{X\2*)%!4*\-}/z}

온라인 데모

이것은 의사 준 선형 시간 *으로 실행되며 OEIS의 진술을 사용합니다.

뫼비우스 변환은주기 4 시퀀스 [4, 0, -4, 0, ...]입니다. -Michael Somos, 2007 년 9 월 17 일

입력 0은 분명히 특별한 경우입니다 (Möbius tranforms 및 annihilators는 잘 어울리지 않습니다). 그러나 결국 한 문자의 비용이 들었습니다.

* 의사-입력의 크기가 아니라 입력 값의 준 선형이기 때문에; 그것은 Theta(n)순서대로 크기의 정수에 대해 연산을 수행 하기 때문에 준 n; b비트의 모드 작업을해야 b lg b하므로 전반적으로이 작업에 걸리는 시간을 Theta(n lg n lg lg n)시간을.


6

apt , 42 37 33 바이트

JaptJa vaScri pt 의 단축 버전입니다 . 통역사

V=Un oU+1;Vr@X+(Vf_p2 +Y*Y¥U)l ,0

작동 원리

           // Implicit: U = input number
V=Un oU+1  // Set variable V to range(-U, U+1). Ends up like [-U,-U+1,...,U-1,U]
Vr@    ,0  // Reduce each item Y in V with this function, starting at 0:
X+(     l  //  Return the previous value X + the length of:
Vf_p2      //   V filtered by items Z where Z*Z
+Y*Y==U)   //    + Y*Y equals U.
           // This ends up as the combined length of all fitting pairs of squares.
           // Implicit: return last expression

아마도 더 좋은 기술이있을 것입니다. 제안은 환영합니다.


6

파이썬 3, 68 61 60 바이트

lambda n:0**n+4*sum(i**.5%1+(n-i)**.5%1==0for i in range(n))

두 개의 중첩 된 목록 이해를 사용하면 너무 비쌉니다. 대신 반경 sqrt (n)의 원에있는 두 좌표가 모두 정수인지 확인합니다.

Peter Taylor는 Moebius-inversion 기반 접근 방식 으로이 문제를 해결했습니다 .


잘 했어. 나는 재귀 함수로 땜질을했지만 n=0우아하게 해결할 수 없었습니다 .
xsot


5

하스켈, 42 바이트

f n|q<-[-n..n]=sum[1|a<-q,b<-q,a*a+b*b==n]

사용 예 :

*Main> map f [0..25]
[1,4,4,0,4,8,0,0,4,4,8,0,0,8,0,0,4,8,4,0,8,0,0,0,0,12]
*Main> 

3
q경비병을 묶는 것은 영리합니다
xnor

5

줄리아, 89 79 63 바이트

g(x)=cos(π*x^.5)^2÷1
a(n)=(n==0)+4sum([g(i)g(n-i)for i=1:n])

이것은 a정수를 받아들이고 float를 반환 하는 명명 된 함수 입니다. 헬퍼 함수를 ​​호출합니다 g.

언 골프 드 :

function g(x::Integer)
    floor(cos(π*sqrt(x))^2)
end

function a(n::Integer)
    (n == 0) + 4*sum([g(i)*g(n-i) for i=1:n])
end

이 방법은 OEIS에 나열된 Wesley Ivan Hurt의 공식을 단순화 한 것입니다. 단순화는이 답변에서 26 바이트를 깎은 바로 그 사람인 Glen O에 의해 발견되었습니다!


3 바이트를 절약 x^.5하기보다는 사용하십시오 sqrt(x). 그리고 (n==0)2 바이트를 절약합니다 1÷(n+1). cos(π*sqrt(x))^2÷1대신 을 사용하여 4 자 이상을 저장할 수 있습니다 floor(cos(π*sqrt(x))^2). 또한 float 대신에 해를 끼치 지 않고 어쨌든 정수에 고정 되기 때문에, 1:n/2대신에 1:n÷2사용하십시오 . 그리고 더 많은 캐릭터들도 면도 할 것입니다. g(x)isum(i->g(i)g(n-i),1:n/2)
Glen O

@GlenO 훌륭한 제안, 감사합니다. 그러나 sum속임수는 실패 n=0하므로 배열 이해력을 유지했습니다.
Alex A.

1
따라서 복구 할 수 있습니다. i=0사례를 합산 한 경우 사인을 켤 수 있습니다 4g(n). 따라서 (n==0)-4g(n)-4g(n/2)+8sum(i->g(i)g(n-i),0:n/2)오류가 발생하지 않습니다. 그러나 대칭에 주목함으로써 더 잘 할 수 있습니다(n==0)+4sum([g(i)g(n-i)for i=1:n])
Glen O

@GlenO 그 단순화는 심각 천재. OEIS 시퀀스의 대체 공식으로 제출하는 것이 좋습니다!
Alex A.

4

Pyth, 16 15 바이트

lfqQs^R2T^}_QQ2

Pyth Compiler 에서 온라인으로 사용해보십시오 .

작동 원리

lfqQs^R2T^}_QQ2

          }_QQ   Compute the inclusive range from -Q to Q (input).
         ^    2  Take the second Cartesian power, i.e., compute all pairs.
 f               Filter; for each T in the list of pairs:
     ^R2T          Compute the squares of T's elements.
    s              Add the squares.
  qQ               Compare the sum with Q.
                 If q returned True, keep T.
l                Count the kept pairs.

4

TI-BASIC, 23 바이트

sum(seq(Σ(X²+Y²=Ans,X,-Ans,Ans),Y,-Ans,Ans

꽤 직설적 인. Σ(요약입니다.

이상하게도, sum(seq(sum(seq(을 던져 ERR:ILLEGAL NEST, 그리고 그렇게 Σ(Σ(하지만 sum(seq(Σ(괜찮습니다. 나는 Σ(가까운 외래를 구하기 위해 내부 를 넣기로 결정했습니다 .


차이 무엇 sumΣ?
alephalpha

1
@alephalpha Σ는 (의 전부를 추가 합산을 얻어 X²+Y²=Ans와 X의 값으로부터 -AnsAns합계 ((A)의 합이다. 리스트 우리 서열 (..., Y, -Ans, 및 ANS하여 제 목록을 생성해야하므로,
lirtosiast

4

자바 스크립트 (ES6), 66 60 바이트

n=>eval("for(r=0,a=~n;a++<n;)for(b=~n;b++<n;)r+=a*a+b*b==n")

@ edc65 덕분에 6 바이트가 절약 되었습니다 !

설명

n=>eval(`              // use eval to allow for loops in an unparenthesised arrow function
  for(r=0,             // r = number of pairs
    a=~n;a++<n;        // a = first number to square
  )
      for(b=~n;b++<n;) // b = second number to square
        r+=a*a+b*b==n  // add one to the result if a^2 + b^2 == n
                       // implicit: return r
`)

테스트

n = <input type="number" oninput='result.innerHTML=(

n=>eval("for(r=0,a=~n;a++<n;)for(b=~n;b++<n;)r+=a*a+b*b==n")

)(+this.value)' /><pre id="result"></pre>


1
60 :n=>eval('for(r=0,a=~n;a++<n;)for(b=~n;b++<n;)r+=a*a+b*b==n')
edc65

@ edc65 니스! 괄호없이 화살표 함수에 루프 eval를 넣는 for데는 생각하지 않았습니다 . 나는 또한 ~운영자 haha를 잊었다 .
user81655

4

파이썬 3, 93 62 69 바이트

Itertools가 작동하지 않아서 두 개의 범위를 다시 사용했지만 바이트를 절약하기 위해 범위를 옮겼습니다.

편집 : n을 정의하기 전에 n 이상의 범위를 정의했기 때문에 이전 코드가 실제로 작동하지 않았습니다.

lambda n:sum(i*i+j*j==n for i in range(-n,n+1)for j in range(-n,n+1))

2

APL, 23 20 19 바이트

{+/⍵=∊∘.+⍨×⍨0,,⍨⍳⍵}

설명:

{+/⍵=∊∘.+⍨×⍨0,,⍨⍳⍵}        Monadic function:
                 ⍳⍵          1 2 3 ... ⍵
               ,⍨            Duplicate
             0,              Concatenate to 0
          ×⍨                 Square everything
      ∘.+⍨                   Make an addition table
     ∊                       Flatten
   ⍵=                        1s where equal to the input
 +/                          Sum up the 1s

APL에 J i:(-n에서 n까지 의 숫자) 기능 이 없다는 사실 외에는 J 응답과 거의 비슷하게 작동합니다.

(가) 점점 때문에 우리는 기차를 사용할 수 없습니다 -\⍳2×⍵로서 구문 분석하지 않는 (-\) ⍳ (2×⍵)3 바이트를 요할 것입니다; 다른 atops와 비슷합니다. 이러한 모든 괄호는 정규 기능을 더 짧게 만듭니다.

여기서 사용해보십시오 . 의 출력은 1모든 값이 일치 함 을 의미합니다.


2

Matlab 41 바이트

이전 답변보다 더 작은

@(n)nnz(~mod(sqrt(n-(1:n^.5).^2),1))*4+~n

본질적으로 Agawa001의 힘과 sqrt의 대답은 대체되었습니다.


2

캔디 , 17 14 바이트

처음에 입력을 스택에 푸시

~TbAT1C(sWs+Aeh)Z

~T0C(sWs+Aeh)Z

peekA    # copy arg from stack to register A
range2   # create double sided range on stack, -A, 1-A, ... A-1, A
digit0   # prefix argument to 'cart', 
cart     # cartesian product of current stack(0), and other stack(0)
while    # while stack not empty
  sqr    # pop and square and push
  swap   # swap two stack elements
  sqr    # pop and square and push
  add    # pop and pop and add and push
  pushA  # push original argument
  equal  # equality test 0/1
  popAddZ  # Z := Z + pop
endwhile
pushZ    # push Z onto stack, will be output to stdout on termination

2

CJam, 28

qi_mF{3a>},{~)\4%2-&}%4+:*1?

실제로 짧지는 않지만 효율적입니다. 예를 들어 15625의 결과는 즉시 28입니다. OEIS의 인수 분해 기반 공식을 사용합니다.
온라인으로 사용해보십시오

설명:

qi       read input and convert to integer
_        make a copy (will be used to handle the 0 case at the end)
mF       factorize into [prime exponent] pairs
{…},     filter the array of pairs
  3a>    with the condition that the pair is greater than [3]
          which means the prime factor must be ⩾3
{…}%     transform each pair as follows:
  ~      dump the prime factor and exponent onto the stack
  )      increment the exponent
  \      swap with the prime
  4%     get the remainder mod 4 (it will be 1 or 3)
  2-     subtract 2 (resulting in -1 or 1)
  &      bitwise AND with the incremented exponent (see below)
4+       append a 4 to the array
:*       multiply all
1?       if the input was 0, use 1, else use the above result

계산에 대한 일부 세부 사항 :

  • 소수가 1 mod 4이면 코드는를 계산합니다 (exponent + 1) & -1.exponent + 1
  • 소수가 3 mod 4 인 경우 코드는를 계산 (exponent + 1) & 1합니다. 지수가 홀수이면 0, 짝수이면 1

이 값에 4를 곱한 값은 모두 정확히 OEIS 공식입니다.


2

파이썬 2, 68 바이트

def x(n):r=range(-n,n+1);print sum(a*a+b*b==n for a in r for b in r)

x()숫자 n을 취하는 함수를 정의합니다 .

온라인으로 사용해보십시오. http://ideone.com/aRoxGF


print또는 return문 이 없습니다 .
Zgarb

고마워, 나는 완전히 잊었다. 링크에는 인쇄 문이 있습니다. 코드를 작성하는 동안 코드를 편집했습니다.
Rɪᴋᴇʀ

알았어요, 걱정하지 마세요. 그러나 이것은 n=0및 에 대해 잘못된 결과를 제공하는 것으로 보입니다 n=1(1 및 4 대신 0 및 2). 아마도 범위 제한을 조정해야합니까?
Zgarb

@Zgarb 그래, 그들은에서 끝나야한다 n+1.
lirtosiast

1
내가 찾아 볼게
Rɪᴋᴇʀ

2

Pyth, 41 35 33 30 27 바이트

온라인으로 사용해보십시오.

편집 : 덕분에 isaacg , 내가 가진 m*F작업에! 예!

?Q*F+4m.&tt%ed4hhdr-PQ2 8 1
                                (implicit) Q = input()
?Q                              If Q != 0
      m                           Map to d (exponent, prime) from ...
                  r-PQ2 8         run-length-encoded(PQ with 2's removed)
       .&                           Bitwise and
           %ed4                       d[-1] % 4
         tt                           -2
                hd                  with d[0]
               h                      +1
    +4                            Append 4 to the resulting array
  *F                              Then multiply it all together
                          1     Else 1

편집 : 더 많은 바이트 절약을 위해 비트 단위를 넣고 다시 넣습니다! 또한 모든 "이전"항목을 제거했습니다. 혼란스러워지기 시작했다.

aditsu 와 그의 CJam 솔루션 및 maltysen 과 그의 팁 덕분에 (하루 m*Fd가 일하러 갈 것입니다. 언젠가는 ...)

J4Vr-PQ2 8=J*J.&tt%eN4hhN;?QJ1
                                (implicit) Q=input()
J4                              J=4
    -PQ2                        Remove all 2's from the prime factorization of Q
   r     8                      run-length encode (exponent, prime factor)
  V                      ;      For N in range( the above ):
          =J*J                      J = J * ...
                tt%eN4                N[-1] mod 4 -2 
                      hhN             (exponent + 1)
              .&                    bitwise and
                          ?QJ1  if Q != 0 print(J) else print(1)

참고

  • 소수가 1 mod 4이면을 얻습니다 -1 & (exponent + 1).exponent + 1

  • 주요 3 모드 4의 경우, 우리는 얻을 1 & (exponent + 1)0지수가 홀수 인 경우, 그리고 1경우에도

모두 곱하면 (처음에 4 번) 입력에 합산되는 두 제곱의 합의 수를 얻습니다.


2

파이썬, 57 바이트

좋은 도전입니다. 불행히도 나는 지금보다 이것보다 짧지 않습니다.

lambda n:0**n+sum(2-d%4for d in range(1,n+1)if d%2>n%d)*4

2

PARI / GP, 34 28 바이트

생성 기능 사용 :

Mitch Schwartz 덕분에 6 바이트가 절약되었습니다 .

n->sum(i=-n,n,x^i^2)^2\x^n%x

내장 된 33 바이트 사용 ( Mitch Schwartz 덕분에 1 바이트 절약 ) :

n->if(n,2*qfrep(matid(2),n)[n],1)

qfrep (q, B, {flag = 0}) : 완전하고 명확한 2 차 형태 q에 대해 1에서 B까지의 규범 벡터 수의 절반 인 벡터 플래그가 1이면 1에서 2B까지 짝수의 벡터를 계산합니다.



matid(2)바이트를 저장합니다.
Mitch Schwartz

1
그리고 생성 함수 접근법에 대한 28 아래로 :n->sum(i=-n,n,x^i^2)^2\x^n%x
미치 슈워츠


1

Matlab, 63 50 바이트

@(y)nnz(~mod(sqrt(y-power((1:sqrt(y)),2)),1))*4+~y

  • 이것은 다른 동일한 인 타이틀먼트 코드를 능가하기 때문에 : D.

  • 프로그램은 양의 정수 솔루션을 찾은 다음 4를 곱하여 음의 솔루션을 포함합니다.

  • 첫 25 가지 테스트 케이스를 모두 수행 할 수 있습니다.

    for i=1:25 ans(i)
    end
    
       1
    
       4
    
       4
    
       0
    
       4
    
       8
    
       0
    
       0
    
       4
    
       4
    
       8
    
       0
    
       0
    
       8
    
       0
    
       0
    
       4
    
       8
    
       4
    
       0
    
       8
    
       0
    
       0
    
       0
    
       0
    
       12
    


@ @ StewieGriffin 덕분에 나는 그것을 루이스 '와 관련된 공정한 게임으로 포함했다
Abr001am

팁 : MATLAB의 결과를 게시 할 계획이라면 format compact=)를 사용 하십시오.
Stewie Griffin

1

자바 스크립트, 89 바이트

n=prompt()
p=Math.pow
for (x=c=(+n?0:1);x<=n;x++)if(x&&p(n-p(x,2),.5)%1===0)c+=4
alert(c)

나는 이것이 i / o 줄을 제거하더라도 JavaScript가 가장 짧은 대답은 아니라는 것을 알고 있지만 몇 초 안에 백만 개의 결과를 얻는 가장 뛰어난 JS 응답이라고 생각합니다. 분).


=== 대신 ==를 사용할 수 있습니까?
lirtosiast

모범 사례를 사용하여 하하.
Adam Dally

1

PHP, 70 바이트, 경쟁하지 않음

for($x=-1;$x++<=$n=$argv[1];)$s+=(-($n%($x-~$x)<1))**$x*4;echo$n?$s:1;

파이썬 답변 중 하나에서 도난당한 알고리즘 ... 나는 어느 것을 잊어 버렸습니다. 내가 게시하기 전에 무슨 일이 일어나고 있는지 적어도 부분적으로 이해하고 싶었습니다.


for(;$x<=$n=$argv[1];)$s+=(-($n%(2*$x+1)<1))**$x++*4;echo$n?$s:1;5 바이트를 절약합니다. $x-~$x같고 2*$x+1이제 변수를 할당하지 않고 시작할 수 있습니다.
Jörg Hülsermann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.