Hitung jumlah dua kotak

45

Diberikan angka non-negatif n, hasilkan jumlah cara untuk menyatakan nsebagai jumlah dari dua kuadrat dari bilangan bulat n == a^2 + b^2( OEIS A004018 ). Catat itu adan bbisa positif, negatif, atau nol, dan urutannya penting. Bytes paling sedikit menang.

Misalnya, n=25memberi 12karena 25dapat dinyatakan sebagai

(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

Berikut adalah nilai hingga n=25. Hati-hati agar kode Anda berfungsi 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

Berikut adalah nilai hingga n=100sebagai daftar.

[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]

Fakta menyenangkan: Urutan berisi istilah yang sewenang-wenang tinggi, dan batas rata-rata berjalannya adalah π.

Papan peringkat:

Tidak
sumber
4
Tunggu apa?? "Urutan berisi istilah yang sewenang-wenang tinggi, dan batas rata-rata berjalannya adalah π."
Stewie Griffin
@StewieGriffin Kedua pernyataan ini konsisten. Pertimbangkan urutannya 1,0,2,0,0,3,0,0,0,4,0,0,0,0,5,.... Memotong urutan setelah nomor bukan nol, rata-rata sejauh ini adalah 1. Dan, berjalan dari 0 memiliki dampak yang semakin sedikit di urutan berikutnya.
xnor
5
Saya tahu ini konsisten .. =) Saya telah memeriksa 10.000 angka pertama ketika saya memposting komentar. Apa yang tidak saya dapatkan adalah: Mengapa bisa sama dengan Pi?
Stewie Griffin
29
@StewieGriffin Jumlah istilah hingga N sesuai dengan poin (a, b) dengan ^ 2 + b ^ 2 <= N. Ini adalah titik-titik kisi dalam lingkaran jari-jari sqrt (N), yang luasnya πN.
xnor
2
@xnor dan mulailah keajaiban :(
Andras Deak

Jawaban:

19

Python ( 59 57 56 byte)

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

Demo online

Seperti dengan jawaban CJam saya, ini menggunakan inversi Möbius dan berjalan dalam pseudoquasilinear.

Berkat Sp3000 untuk penghematan 2 byte, dan feersum untuk 1.

Peter Taylor
sumber
1
Tanda kurung itu menyebalkan.
lirtosiast
@ ThomasKwa, ceritakan tentang itu. Hal yang benar-benar mengejutkan saya, dalam salah satu versi yang saya lewati dalam perjalanan ke yang pertama saya posting, -1**xadalah selalu begitu -1. Saya berharap -1untuk menjadi token bilangan bulat tunggal daripada minus rendah didahulukan dikurangi diikuti oleh satu.
Peter Taylor
2
Selamat atas hadiahnya! Kode Anda lebih pendek dari apa pun yang saya buat. Solusi Anda didasarkan pada ide matematika yang sama sekali baru dan tidak terduga, dan itu membuat saya gembira bahwa ini mungkin bahkan dalam tantangan yang tampak langsung. Hasil inversi Mobius cukup cantik dan saya senang mendapatkan bukti untuk diri.
xnor
1 byte dapat disimpan dengan memindahkan perkalian dengan 4 ke setelah **x.
feersum
@PeterTaylor Bisakah Anda menguraikan bagaimana algoritma Anda bekerja / dapatkah Anda mengarahkan saya ke sumber daya? Saya tidak bisa melihat bagaimana Anda bisa menerapkan inversi möbius ke jumlah jumlah masalah suqares.
flawr
15

Mathematica, 13 byte

Jika built-in diizinkan, ini adalah cara melakukannya di Mathematica.

2~SquaresR~#&

Untuk 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, 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, 0, 4 , 12, 0, 8, 8, 0, 0, 0, 0, 8, 0, 0, 8, 0, 0, 4, 16, 0, 0, 8, 0, 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, 0, 8, 4, 0 , 12}

DavidC
sumber
1
Karena tentu saja Mathematica memiliki bawaan untuk ini.
HyperNeutrino
14

Python 2, 44 byte

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

Ini hampir sama dengan solusi xsot (yang didasarkan pada solusi Peter Taylor ), tetapi menyimpan 8 byte dengan menyederhanakan cara tanda ditangani.

Perhatikan bahwa untuk program lengkap, kita dapat menghemat 2 byte dalam fungsi tanpa menimbulkan biaya di luar fungsi:

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

Dua byte tambahan untuk program lengkap dengan cara ini:

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

Karena n > 0ada solusi 40 byte yang sangat terbaca:

f=lambda n,x=1:n/x and(n%x<1)*4-f(n,x+2)
Mitch Schwartz
sumber
1
Selamat untuk memenangkan hadiah! Pengurangan rekursif adalah cara yang bersih dan pendek untuk mengekspresikan jumlah bolak-balik untuk pembagi ganjil tanpa perlu mengekstrak tanda dari pembagi itu sendiri. Juga, kredit untuk xsot untuk merampingkan solusi Peter Taylor ke solusi rekursif dengan penanganan pintar n = 0.
xnor
12

Pyth, 13 byte

/sM^^R2}_QQ2Q

Suite uji

/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
isaacg
sumber
Terlambat, tapi kupikir kau tidak membutuhkan yang terakhir Q.
Erik the Outgolfer
12

J, 16 byte

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

Ini adalah kata kerja monadik (dengan kata lain, fungsi unary). Cobalah secara online atau lihat lulus semua kasus uji .

Penjelasan

+/@,@:=+&*:/~@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
Zgarb
sumber
11

Python 2, 69 55 53 52 byte

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

Ini adalah fungsi rekursif yang didasarkan pada solusi sempurna Peter Taylor .

xsot
sumber
1
Ini merupakan kemajuan besar. Tapi, masih ada cara untuk membuatnya lebih pendek, dan saya mendorong Anda untuk mencarinya.
xnor
1
@ xnor Byte lain turun. Saya harap Anda tidak memiliki trik lagi di lengan baju Anda.
xsot
2
Aku tidak tahu apakah aku harus membuat jawaban itu, itu hanya Anda solusi ditambah satu trik: f=lambda n,x=1:+(x>n)or(n%x<1)-f(n,x+2)/4<<2. Juga, saya kira kita tidak peduli melebihi kedalaman rekursi maksimum default?
Mitch Schwartz
1
@MitchSchwartz Saya pikir itu peningkatan luar biasa yang layak dari karunia dan kemungkinan optimasi final xnor ada dalam pikiran.
xsot
1
@ItchSchwartz Ya, itulah optimasi yang saya pikirkan! Dan /4<<2trik xsot membuatnya lebih pendek dari yang saya miliki.
xnor
8

Julia, 40 byte

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

Tidak Disatukan:

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

Perhatikan bahwa loop tidak termasuk i==0, karena ketika nkotak, itu sudah termasuk oleh i=sqrt(n), dan hanya ada empat, bukan delapan, untuk formulir itu ( 0^2+k^2, 0^2+(-k)^2, k^2+0^2, (-k)^2+0^2).

Glen O
sumber
7

CJam, 25 23 byte

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

Ini adalah solusi teoretis yang membutuhkan O (9 n ) waktu dan memori untuk input n .

Dengan biaya satu byte tambahan - untuk total 24 byte - kita dapat mengurangi kompleksitas menjadi O (n 2 ) :

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

Cobalah online!

Bagaimana itu bekerja

Antara

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

atau

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

Kemudian

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.
Dennis
sumber
Dan dengan menghemat satu byte, kompleksitas bisa diturunkan menjadi Õ (n)
Peter Taylor
Ya, saya melihat. Itu luar biasa.
Dennis
7

CJam ( 25 24 22 21 bytes)

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

Demo online

Ini berjalan dalam pseudoquasilinear * dan menggunakan pernyataan dari OEIS itu

Transformasi Moebius adalah urutan periode 4 [4, 0, -4, 0, ...]. - Michael Somos, 17 Sep 2007

Input 0 jelas merupakan kasus khusus (Möbius tranforms dan annihilator tidak cocok bersama), tetapi pada akhirnya hanya memakan satu char.

* Pseudo- karena itu adalah quasilinear dalam nilai input, bukan ukuran input; kuasi karena melakukan Theta(n)operasi pada bilangan bulat ukuran pada urutan n; sebuah boperasi -bit mod harus mengambil b lg bwaktu, sehingga secara keseluruhan ini membutuhkan Theta(n lg n lg lg n)waktu.

Peter Taylor
sumber
6

Japt , 42 37 33 byte

Japt adalah versi singkat dari Ja vaScri pt . Penerjemah

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

Bagaimana itu bekerja

           // 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

Mungkin ada teknik yang lebih baik; saran dipersilahkan.

Produksi ETH
sumber
6

Python 3, 68 61 60 byte

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

Menggunakan dua daftar pemahaman bersarang terlalu mahal. Sebagai gantinya, ini memeriksa apakah kedua koordinat pada lingkaran jari-jari sqrt (n) adalah bilangan bulat.

Peter Taylor telah mengalahkan ini dengan pendekatan berbasis inversi Moebius .

lirtosiast
sumber
Sudah selesai dilakukan dengan baik. Saya mengutak-atik fungsi rekursif tetapi tidak bisa menyelesaikan dengan n=0elegan.
xsot
5

Oktaf, 28 byte

@(n)nnz((a=(-n:n).^2)'+a==n)
alephalpha
sumber
5

Haskell, 42 byte

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

Contoh penggunaan:

*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> 
nimi
sumber
3
Mengikat qpenjaga itu cerdas, saya akan ingat trik ini.
xnor
5

Julia, 89 79 63 byte

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

Ini adalah fungsi bernama ayang menerima integer dan mengembalikan float. Itu memanggil fungsi pembantu g.

Tidak Disatukan:

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

Pendekatan di sini menggunakan penyederhanaan formula Wesley Ivan Hurt yang terdaftar di OEIS. Penyederhanaan ditemukan oleh Glen O, orang yang sama yang mencukur 26 byte dari jawaban ini!

Alex A.
sumber
Gunakan x^.5daripada sqrt(x)menyimpan 3 byte. Dan (n==0)menghemat 2 byte lebih 1÷(n+1). Dan Anda dapat menyimpan 4 karakter lebih banyak dengan menggunakan cos(π*sqrt(x))^2÷1daripada floor(cos(π*sqrt(x))^2). Juga, gunakan 1:n/2daripada 1:n÷2, karena tidak ada salahnya menggunakan float di g(x)dan itu akan dikunci ke bilangan bulat untuk itetap. Dan sum(i->g(i)g(n-i),1:n/2)akan mencukur beberapa karakter lagi juga.
Glen O
@ GlenO Saran yang bagus, terima kasih. The sumtrick gagal untuk n=0meskipun, jadi aku terus array yang pemahaman.
Alex A.
1
Jadi, ini dapat dipulihkan - jika Anda membiarkan i=0kasingnya terjadi, Anda dapat mengaktifkannya 4g(n). Jadi (n==0)-4g(n)-4g(n/2)+8sum(i->g(i)g(n-i),0:n/2), yang tidak akan mengalami kesalahan. Tetapi Anda dapat melakukan yang lebih baik lagi, dengan mencatat simetri -(n==0)+4sum([g(i)g(n-i)for i=1:n])
Glen O
@ GlenO Penyederhanaan itu benar - benar jenius. Saya sarankan Anda mengirimkannya sebagai formula alternatif untuk urutan di OEIS!
Alex A.
4

Pyth, 16 15 byte

lfqQs^R2T^}_QQ2

Cobalah online di Pyth Compiler .

Bagaimana itu bekerja

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.
Dennis
sumber
4

TI-BASIC, 23 byte

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

Cukup mudah. Σ(adalah penjumlahan.

Anehnya, sum(seq(sum(seq(melempar ERR:ILLEGAL NEST, dan begitu juga Σ(Σ(, tetapi sum(seq(Σ(baik-baik saja. Saya memilih untuk meletakkan Σ(di dalam untuk menyimpan paren dekat.

lirtosiast
sumber
Apa perbedaan antara sumdan Σ?
alephalpha
1
@alephalpha Σ (mengambil penjumlahan, menjumlahkan semua dari X²+Y²=Ansdari nilai X antara -Ansdan Ans. jumlah (adalah jumlah daftar , jadi kita perlu membuat daftar terlebih dahulu menggunakan seq (..., Y, -Ans, Ans
lirtosiast
4

JavaScript (ES6), 66 60 byte

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

6 byte disimpan berkat @ edc65 !

Penjelasan

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
`)

Uji

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>

pengguna81655
sumber
1
60:n=>eval('for(r=0,a=~n;a++<n;)for(b=~n;b++<n;)r+=a*a+b*b==n')
edc65
@ edc65 Bagus! Saya tidak berpikir menggunakan evaluntuk menempatkan forloop ke fungsi panah tanpa tanda kurung. Saya juga lupa tentang ~operator haha.
user81655
4

Python 3, 93 62 69 byte

Itertools tidak berfungsi jadi saya menggunakan dua rentang lagi, tetapi memindahkan rentang untuk menghemat byte.

Sunting: Kode sebelumnya tidak benar-benar berfungsi, karena saya menetapkan rentang n sebelum saya mendefinisikan n.

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

APL, 23 20 19 byte

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

Penjelasan:

{+/⍵=∊∘.+⍨×⍨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

Selain fakta bahwa APL tidak memiliki i:fungsi J (angka dari -n ke n), ini berfungsi seperti jawaban J.

Kami tidak dapat menggunakan kereta api karena mendapatkan yang -\⍳2×⍵tidak parse seperti (-\) ⍳ (2×⍵)akan menelan biaya tiga byte; sama dengan sepasang atops lainnya. Semua tanda kurung membuat fungsi reguler lebih pendek.

Coba di sini . Output dari 1semua nilai cocok.

lirtosiast
sumber
2

Matlab 41 byte

Bahkan lebih kecil dari jawaban sebelumnya

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

Pada dasarnya jawaban Agawa001 dengan kekuatan dan sqrt diganti

Jonas
sumber
2

Candy , 17 14 byte

Input didorong ke stack pada awalnya

~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
Dale Johnson
sumber
2

CJam, 28

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

Tidak terlalu pendek, tetapi efisien. Misalnya hasil untuk 15625 adalah langsung 28. Menggunakan rumus berbasis faktorisasi dari OEIS.
Cobalah online

Penjelasan:

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

Beberapa detail tentang perhitungan:

  • jika prime adalah 1 mod 4, kode tersebut menghitung (exponent + 1) & -1, yaituexponent + 1
  • jika prime adalah 3 mod 4, kode akan menghitung (exponent + 1) & 1, yaitu 0 jika eksponennya ganjil, dan 1 jika genap

Semua nilai ini dikalikan bersama dan dikalikan dengan 4 persis dengan formula OEIS.

aditsu
sumber
2

Python 2, 68 byte

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

Menentukan fungsi yang dipanggil x()yang mengambil angka n.

Cobalah online. http://ideone.com/aRoxGF

Rɪᴋᴇʀ
sumber
Anda melewatkan printatau returnpernyataan.
Zgarb
Terima kasih, saya benar-benar lupa. Tautan memiliki pernyataan cetak. Saya mengedit kode saya ketika sedang membuat kode.
Rɪᴋᴇʀ
OK tidak masalah. Tetapi ini juga tampaknya memberikan hasil yang salah untuk n=0dan n=1(0 dan 2 bukannya 1 dan 4). Mungkin batas rentang perlu disesuaikan?
Zgarb
@ Zgarb Ya, mereka harus berakhir pada n+1.
lirtosiast
1
Saya akan mencarinya.
Rɪᴋᴇʀ
2

Pyth, 41 35 33 30 27 byte

Cobalah online.

Sunting: Berkat isaacg , saya dapat mdan *Fbekerja! IYA!

?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

Sunting: Masukkan bitwise dan kembali untuk penghematan byte lebih banyak! Juga saya menghapus semua hal "Sebelumnya". Itu mulai berantakan.

Terima kasih kepada aditsu dan solusi CJam-nya, dan untuk maltysen dan tip-tipnya (Suatu hari saya akan mulai m*Fdbekerja. Suatu hari ...)

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)

Perhatikan bahwa,

  • jika prime adalah 1 mod 4, kita dapatkan -1 & (exponent + 1), yaituexponent + 1

  • tetapi jika prime adalah 3 mod 4, kita dapatkan 1 & (exponent + 1), yaitu 0jika eksponennya aneh, dan 1jika genap

Lipat gandakan semuanya (kali 4 di awal) dan kami mendapatkan jumlah penjumlahan dari dua kotak yang menambah input kami.

Sherlock9
sumber
2

Python, 57 byte

Tantangan yang bagus. Sayangnya saya tidak mendapatkannya lebih pendek dari ini saat ini.

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

PARI / GP, 34 28 byte

Menggunakan fungsi pembangkit:

Disimpan 6 byte berkat Mitch Schwartz .

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

Menggunakan built-in, 33 byte (disimpan 1 byte berkat Mitch Schwartz .):

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

qfrep (q, B, {flag = 0}): vektor (setengah) jumlah vektor norma dari 1 ke B untuk bentuk kuadratik integral dan pasti q. Jika flag adalah 1, hitung vektor norma normal dari 1 hingga 2B.


alephalpha
sumber
matid(2)menghemat satu byte.
Mitch Schwartz
1
Dan turun ke 28 untuk pendekatan fungsi pembangkit:n->sum(i=-n,n,x^i^2)^2\x^n%x
Mitch Schwartz
1

Matlab, 72 byte

n=input('');m=fix(sqrt(n));m=(-m:m).^2;disp(nnz(bsxfun(@plus,m,m')==n))
Luis Mendo
sumber
Anda tidak perlu dispdalam tantangan ini Luis! =)
Stewie Griffin
@StewieGriffin Terima kasih! Tetapi dalam hal ini adalah program, bukan fungsi. Jadi menurut jawaban yang diterima di tautan Anda, itu perlu, bukan?
Luis Mendo
1

Matlab, 63 50 byte

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

  • Ini mengalahkan kode lain yang sama berjudul, jadi saya katakan: D.

  • Program ini menemukan solusi integer positif kemudian dikalikan dengan 4 untuk mencakup yang negatif.

  • Itu dapat melakukan semua 25 kasus uji pertama

    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
    
Abr001am
sumber
Anda tidak perlu dispdalam tantangan ini ! =)
Stewie Griffin
terima kasih @StewieGriffin saya memang memasukkannya hanya sebagai permainan yang adil yang berkaitan dengan luis '
Abr001am
Tips: Ketika Anda berencana memposting hasil dari MATLAB, gunakan format compact=)
Stewie Griffin
1

JavaScript, 89 byte

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)

Saya tahu ini bukan jawaban JavaScript terpendek bahkan jika saya harus menghapus garis i / o, tapi saya pikir itu adalah jawaban JS berkinerja terbaik yang memberi saya hasil untuk satu juta dalam beberapa detik (sepuluh juta mengambil sekitar menit).

Adam Dally
sumber
Bisakah Anda menggunakan == bukannya ===?
lirtosiast
Saya bisa, hanya menggunakan praktik terbaik, ha ha.
Adam Dally
1

PHP, 70 byte, tidak bersaing

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

algoritma dicuri dari salah satu jawaban Python ... Saya lupa yang mana; ingin setidaknya sebagian memahami apa yang terjadi sebelum saya memposting.

Titus
sumber
for(;$x<=$n=$argv[1];)$s+=(-($n%(2*$x+1)<1))**$x++*4;echo$n?$s:1;menghemat 5 Bytes. $x-~$xsama dengan 2*$x+1dan sekarang Anda dapat mulai tanpa menetapkan variabel.
Jörg Hülsermann