Combien de façons d'écrire des nombres comme des sommes de carrés?


12

Tâche

Étant donné deux nombres entiers det n, trouvez le nombre de façons d'exprimer nune somme de dcarrés. C'est-à- n == r_1 ^2 + r_2 ^2 + ... + r_d ^2dire que tel r_mest un entier pour tous les entiers 1 ≤ m ≤ d. Notez que l'échange de deux valeurs différentes (par exemple r_1et r_2) est considéré comme différent de la solution d'origine.

Par exemple, le nombre 45 peut être écrit comme une somme de 2 carrés de 8 manières différentes:

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

Règles

  • Les solutions intégrées sont autorisées mais non concurrentes (ahem, Mathematica )
  • Les failles standard sont également interdites.
  • Les entrées peuvent être inversées.

Exemple d'E / S

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

C'est du , donc les soumissions utilisant le moins d'octets gagnent!


Pourquoi avez-vous supprimé cela et en avez posté un nouveau alors que vous pouvez modifier le message que vous avez supprimé?
Leaky Nun

@LeakyNun Mon navigateur a généré des erreurs lorsque j'ai essayé de le modifier, avant même de le supprimer.
JungHwan Min


1
Non, n est 0, pas d.
Leaky Nun

1
Pour @DeadPossum 1, 0cas de test, il y a 1moyen d'exprimer 0comme une somme de 1carrés: 0 == 0^2.
JungHwan Min

Réponses:


7

Python 3 , 125 octets

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

Essayez-le en ligne!

Termine le dernier boîtier de test en 0,078 s. La complexité naïve est O ( d n 2 ).


5

Mathematica, 8 octets, sans compétition

SquaresR

3
Comme si cela était même nécessaire ... n'ajoute rien de nouveau à la question. : P
Erik the Outgolfer

@EriktheOutgolfer Blâmez la question; il indique explicitement que c'est autorisé.
JollyJoker

Ces moments où les solutions non intégrées ont presque battu les solutions intégrées: D
David Mulder

@JollyJoker Mon point est que les réponses devraient ajouter quelque chose à la question, sinon pourquoi même les publier? * haussement d'épaules *: P
Erik the Outgolfer

@DavidMulder J'ai d'abord raté "presque" et j'ai été choqué un peu ...
Erik the Outgolfer


4

MATL , 13 octets

y_t_&:Z^U!s=s

Les entrées sont ndonc d. Certains cas de test manquent de mémoire.

Essayez-le en ligne!

Explication

Tenez compte des entrées 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 octets

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

Juste votre récursion de base. Définit une fonction d'infixe binaire #. Essayez-le en ligne!

Explication

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.

Si d == 0et n /= 0, nous sommes dans le deuxième cas, et la condition d>0fait que la liste est vide. La somme de la liste vide est 0, ce qui est la sortie correcte dans ce cas.



2

05AB1E , 10 octets

Ð(Ÿ²ã€nOQO

Prend les arguments comme n, puis d. A des problèmes pour résoudre les plus gros cas de test.

Essayez-le en ligne!

Explication

Ð(Ÿ²ã€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 octets

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

Pure fonction de prendre les entrées dans l'ordre n, d. Range[-#,#]^2donne l'ensemble de tous les carrés éventuellement pertinents, avec des carrés positifs énumérés deux fois pour rendre le décompte correct; Tuples[...,#2]produit les d-tuples de ces carrés; Tr/@somme chaque d-tuple; et Count[...,#]compte combien de résultats sont égaux n.

Les premiers cas de test se terminent rapidement, mais j'estime qu'il faudrait environ six mois pour exécuter le cas de test 1000,4. Le remplacement Range[-#,#]par le (plus long mais) plus sensible Range[-Floor@Sqrt@#,Floor@Sqrt@#]accélère ce calcul à environ 13 secondes.


1

Mathematica, 53 51 octets

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

1

Python 2, 138

Solution très inefficace avec mon bien-aimé eval. Pourquoi pas?
Essayez-le en ligne

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

Il a généré et évalue du code comme ceci:

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

Donc, pour certains gros d, il fonctionnera très longtemps et consommera beaucoup de mémoire, avec une complexité de O (n ^ d)



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.