Quanti modi per scrivere numeri come somme di quadrati?


12

Compito

Dati due numeri interi de n, trova il numero di modi per esprimere ncome somma di dquadrati. Cioè n == r_1 ^2 + r_2 ^2 + ... + r_d ^2, tale r_mè un numero intero per tutti i numeri interi 1 ≤ m ≤ d. Si noti che lo scambio di due valori diversi (ad es. r_1E r_2) è considerato diverso dalla soluzione originale.

Ad esempio, il numero 45 può essere scritto come una somma di 2 quadrati in 8 modi diversi:

45
== (-6)^2 + (-3)^2
== (-6)^2 + 3^2
== (-3)^2 + (-6)^2
== (-3)^2 + 6^2
== 3^2 + (-6)^2
== 3^2 + 6^2
== 6^2 + (-3)^2
== 6^2 + 3^2

Regole

  • Le soluzioni integrate sono consentite ma non concorrenti (ahem, Mathematica )
  • Sono inoltre vietate le scappatoie standard.
  • Gli ingressi possono essere invertiti.

Esempio di I / O

In:   d, n

In:   1, 0
Out:  1

In:   1, 2
Out:  0

In:   2, 2
Out:  4

In:   2, 45
Out:  8

In:   3, 17
Out:  48

In:   4, 1000
Out:  3744

In:   5, 404
Out:  71440

In:   11, 20
Out:  7217144

In:   22, 333
Out:  1357996551483704981475000

Si tratta di , quindi vinci gli invii utilizzando il minor numero di byte!


Perché si elimina questo e pubblicato uno nuovo, mentre è possibile modificare il post è stato eliminato?
Leaky Nun,

@LeakyNun Il mio browser ha generato errori quando ho provato a modificarlo, anche prima di eliminarlo.
JungHwan Min,


1
No, n è 0, non d.
Leaky Nun,

1
@DeadPossum Per 1, 0banco di prova, non v'è 1modo di esprimere 0come somma di 1piazza: 0 == 0^2.
JungHwan Min,

Risposte:


7

Python 3 , 125 byte

n,d=eval(input())
W=[1]+[0]*n
exec("W=[sum(-~(j>0)*W[i-j*j]for j in range(int(i**.5)+1))for i in range(n+1)];"*d)
print(W[n])

Provalo online!

Termina l'ultimo testcase in 0,078 s. La complessità ingenua è O ( d n 2 ).


5

Mathematica, 8 byte, non competitiva

SquaresR

3
Come se fosse necessario ... non aggiunge nulla di nuovo alla domanda. : P
Erik the Outgolfer,

@EriktheOutgolfer Dai la colpa alla domanda; afferma esplicitamente che è permesso.
JollyJoker,

Quei momenti in cui le soluzioni non integrate hanno quasi battuto le soluzioni integrate: D
David Mulder,

@JollyJoker Il mio punto è che le risposte dovrebbero aggiungere qualcosa alla domanda, altrimenti perché pubblicarle? * scrollata di spalle *: P
Erik the Outgolfer,

@DavidMulder All'inizio mi mancava "quasi" e rimasi scioccato per un po '...
Erik the Outgolfer


4

MATL , 13 byte

y_t_&:Z^U!s=s

Gli input sono n, quindi d. Alcuni casi di test esauriscono la memoria.

Provalo online!

Spiegazione

Considerate ingressi 17, 3.

y     % Implicit inputs. Duplicate from below
      % STACK: 17, 3, 17
_     % Negate
      % STACK: 17, 3, -17
t_    % Duplicate. Negate
      % STACK: 17, 3, -17, 17
&:    % Two-input range
      % STACK: 17, 3, [-17 -16 ... 17]
Z^    % Cartesian power. Gives a matrix where each Cartesian tuple is a row
      % STACK: 17, [-17 -17 -17; -17 -17 -16; ...; 17 17 17]
U     % Square, element-wise
      % STACK: 17, [289 289 289; 289 289 256; ...; 289 289 289]
!s    % Transpose. Sum of each column
      % STACK: 17, [867 834 ... 867]
=     % Equals?, element-wise
      % STACK: 17, [0 0 ... 0] (there are 48 entries equal to 1 in between)
s     % Sum. Implicit display
      % STACK: 48

3

Haskell , 43 byte

0#0=1
d#n=sum[(d-1)#(n-k*k)|d>0,k<-[-n..n]]

Solo la tua ricorsione di base. Definisce una funzione di infissione binaria #. Provalo online!

Spiegazione

0#0=1            -- If n == d == 0, give 1.
d#n=             -- Otherwise,
 sum[            -- give the sum of
  (d-1)#(n-k*k)  -- these numbers
  |d>0,          -- where d is positive
   k<-[-n..n]]   -- and k is between -n and n.

Se d == 0e n /= 0, siamo nel secondo caso, e la condizione d>0fa sì che l'elenco sia vuoto. La somma dell'elenco vuoto è 0, che in questo caso è l'output corretto.



2

05AB1E , 10 byte

Ð(Ÿ²ã€nOQO

Prende gli argomenti come n, quindi d. Ha problemi a risolvere i casi di test più grandi.

Provalo online!

Spiegazione

Ð(Ÿ²ã€nOQO   Arguments n, d
Ð            Triplicate n on stack
 (           Negate n
  Ÿ          Range: [-n ... n]
   ²ã        Caertesian product of length d
     €n      Square each number
       OQ    Sum of pair equals n
         O   Total sum (number of ones)


2

Mathematica, 38 byte

Count[Tr/@Tuples[Range[-#,#]^2,#2],#]&

Pura funzione prendendo gli ingressi nell'ordine n, d. Range[-#,#]^2fornisce l'insieme di tutti i quadrati eventualmente rilevanti, con i quadrati positivi elencati due volte per rendere corretto il conteggio; Tuples[...,#2]produce le dtuple di tali quadrati; Tr/@somma ogni dcoppia; e Count[...,#]conta quanti risultati sono uguali n.

I primi casi di test terminano rapidamente, ma stima che occorrerebbe circa un anno e mezzo per eseguire il test 1000,4. La sostituzione Range[-#,#]con il (più lungo ma) più sensibile Range[-Floor@Sqrt@#,Floor@Sqrt@#]accelera quel calcolo a circa 13 secondi.


1

Mathematica, 53 51 byte

SeriesCoefficient[EllipticTheta[3,0,x]^#,{x,0,#2}]&

1

Python 2, 138

Soluzione molto inefficiente con il mio amato eval. Perchè no?
Provalo online

lambda n,d:d and 4*eval(eval("('len({('+'i%s,'*d+'0)'+'for i%s in range(n)'*d+'if '+'i%s**2+'*d+'0==n})')%"+`tuple(range(d)*3)`),locals())

Ha generato e valuta il codice in questo modo:

len({(i0,i1,0)for i0 in range(n)for i1 in range(n)if i0**2+i1**2+0==n})

Quindi per alcuni grandi d durerà molto a lungo e consumerà molta memoria, avendo complessità di O (n ^ d)



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.