Quantas maneiras de escrever números como somas de quadrados?

12

Tarefa

Dado dois números inteiros de n, encontre o número de maneiras de expressar ncomo uma soma dos dquadrados. Ou seja,, n == r_1 ^2 + r_2 ^2 + ... + r_d ^2tal que r_mseja um número inteiro para todos os números inteiros 1 ≤ m ≤ d. Observe que a troca de dois valores diferentes (por exemplo, r_1e r_2) é considerada diferente da solução original.

Por exemplo, o número 45 pode ser escrito como uma soma de 2 quadrados de 8 maneiras diferentes:

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

Regras

  • Soluções integradas são permitidas, mas não concorrentes (ahem, Mathematica )
  • As brechas padrão também são proibidas.
  • As entradas podem ser revertidas.

Exemplo de 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

Isso é , então envios usando o menor número de bytes ganham!

JungHwan Min
fonte
Por que você excluiu isso e postou um novo enquanto pode editar a postagem que excluiu?
Leaky Nun
@LeakyNun Meu navegador gerou erros quando tentei editá-lo, mesmo antes de excluí-lo.
JungHwan Min
Related
Luis Mendo
1
Não, n é 0, não d.
Leaky Nun
1
@DeadPossum Para 1, 0caso de teste, não há 1maneira de expressar 0como uma soma de 1quadrado: 0 == 0^2.
JungHwan Min

Respostas:

7

Python 3 , 125 bytes

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

Experimente online!

Finaliza o último caso de teste em 0,078 s. Complexidade ingênua é O ( d n 2 ).

Freira Furada
fonte
5

Mathematica, 8 bytes, não concorrente

SquaresR
alefalpha
fonte
3
Como se isso fosse necessário ... não acrescenta nada de novo à pergunta. : P
Erik the Outgolfer
@EriktheOutgolfer Responsabilize a pergunta; afirma explicitamente que é permitido.
jollyjoker
Aqueles momentos em que não incorporados-in soluções quase bater built-in soluções: D
David Mulder
@JollyJoker Meu argumento é que as respostas devem adicionar algo à pergunta, caso contrário, por que postá-las? * shrug *: P
Erik the Outgolfer
@DavidMulder I no primeiro perdeu "quase" e ficou chocado por um pouco ...
Erik o Outgolfer
5

Geléia , 9 bytes

Nr⁸²ṗS€ċ⁸

Experimente online!

Toma ne dnesta ordem.

Erik, o Outgolfer
fonte
Quantos anos levaria para o último caso de teste?
Leaky Nun
@LeakyNun Eu não sei, isso está além da minha compreensão ...
Erik o Outgolfer
4

MATL , 13 bytes

y_t_&:Z^U!s=s

Entradas são n, então d. Alguns dos casos de teste ficam sem memória.

Experimente online!

Explicação

Considere entradas 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
Luis Mendo
fonte
3

Haskell , 43 bytes

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

Apenas sua recursão básica. Define uma função de infixo binário #. Experimente online!

Explicação

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, estamos no segundo caso, e a condição d>0faz com que a lista fique vazia. A soma da lista vazia é 0, que é a saída correta neste caso.

Zgarb
fonte
2

05AB1E , 10 bytes

Ð(Ÿ²ã€nOQO

Aceita os argumentos como n, depois d. Tem problemas para resolver os casos de teste maiores.

Experimente online!

Explicação

Ð(Ÿ²ã€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)
kalsowerus
fonte
2

Mathematica, 38 bytes

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

Pura função de tomar as entradas na ordem n, d. Range[-#,#]^2fornece o conjunto de todos os quadrados possivelmente relevantes, com quadrados positivos listados duas vezes para corrigir a contagem; Tuples[...,#2]produz os dpares de tais quadrados; Tr/@soma cada d-tuplo; e Count[...,#]conta quantos resultados são iguais n.

Os primeiros casos de teste terminam rapidamente, mas estimo que isso levaria cerca de meio ano para ser executado no caso de teste 1000,4. A substituição Range[-#,#]pelo (mais longo, mas) mais sensível Range[-Floor@Sqrt@#,Floor@Sqrt@#]acelera esse cálculo para cerca de 13 segundos.

Greg Martin
fonte
1

Mathematica, 53 51 bytes

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

Python 2, 138

Solução muito ineficiente com a minha amada avaliação. Por que não?
Experimente 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())

Ele gerou e avalia código como este:

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

Portanto, para alguns grandes d, ele será executado por muito tempo e consumirá muita memória, tendo complexidade de O (n ^ d)

Gambá morto
fonte
1

k , 23 bytes

{+/y=+/{x*x}y-!x#1+2*y}

Experimente online! É um simples forçador bruto.

zgrep
fonte
1

Pitão - 16 bytes

lfqQsm*ddT^}_QQE

Tente

É terrivelmente ineficiente

Maria
fonte