Скільки способів записати числа як суми квадратів?


12

Завдання

Дано два цілих числа dі n, знайди кількість способів виразити nу вигляді суми dквадратів. Тобто n == r_1 ^2 + r_2 ^2 + ... + r_d ^2, таке, що r_mє цілим числом для всіх цілих чисел 1 ≤ m ≤ d. Зауважте, що підміна двох різних значень (наприклад, r_1та r_2) вважається відмінною від вихідного рішення.

Наприклад, число 45 можна записати у вигляді суми двох квадратів 8 різних способів:

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

Правила

  • Вбудовані рішення дозволені, але неконкурентоспроможні (ах, Mathematica )
  • Стандартні лазівки також заборонені.
  • Входи можуть бути зворотні.

Приклад вводу / виводу

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

Це , тому подання з використанням найменших байтів виграють!


Чому ви видалили це і опублікували нове, поки ви могли редагувати видалену публікацію?
Лина монашка

@LeakyNun Мій браузер видав помилки, коли я намагався редагувати це, навіть перед тим, як видалити його.
JungHwan Min


1
Ні, n - 0, не d.
Leaky Nun

1
@DeadPossum Для 1, 0тесту, є 1спосіб висловити 0у вигляді суми 1квадрата: 0 == 0^2.
JungHwan Min

Відповіді:



5

Математика, 8 байт, неконкурентна

SquaresR

3
Начебто це навіть було потрібно ... не додає нічого нового до питання. : P
Ерік Аутгольфер

@EriktheOutgolfer Винен в цьому питання; в ньому прямо вказано, що це дозволено.
JollyJoker

Ті моменти, коли невбудовані рішення майже перемогли вбудовані рішення: D
Девід Малдер

@JollyJoker Моя думка полягає в тому, що відповіді повинні щось додати до питання, інакше навіщо взагалі їх публікувати? *
знизати

@DavidMulder Я спочатку пропустив "ледь не" і був трохи шокований ...
Ерік the Outgolfer


4

MATL , 13 байт

y_t_&:Z^U!s=s

Входи n, а потім d. У деяких тестових випадках не вистачає пам'яті.

Спробуйте в Інтернеті!

Пояснення

Розглянемо входи 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 байти

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

Просто ваша основна рекурсія. Визначає функцію бінарної інфіксації #. Спробуйте в Інтернеті!

Пояснення

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.

Якщо d == 0і n /= 0, ми знаходимося у другому випадку, і умова d>0спричиняє список порожнім. Сума порожнього списку дорівнює 0, що є правильним результатом у цьому випадку.



2

05AB1E , 10 байт

Ð(Ÿ²ã€nOQO

Вважає аргументи як n, то d. Має проблеми з вирішенням більших тестових випадків.

Спробуйте в Інтернеті!

Пояснення

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

Математика, 38 байт

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

Чистий функція приймає вхідні дані в порядку n, d. Range[-#,#]^2дає набір усіх можливих відповідних квадратів, причому позитивні квадрати перераховані двічі, щоб зробити кількість правильним; Tuples[...,#2]виробляє d-парні таких квадратів; Tr/@сум кожний d-повна; і Count[...,#]підраховує, скільки результатів дорівнює n.

Перші кілька тестових випадків швидко закінчуються, але, на мою думку, на тестування потрібно тривати півроку 1000,4. Заміна Range[-#,#]на (довший, але) більш розумний Range[-Floor@Sqrt@#,Floor@Sqrt@#]прискорює обчислення приблизно до 13 секунд.



1

Пітон 2, 138

Дуже неефективне рішення з моїм коханим eval. Чому ні?
Спробуйте в Інтернеті

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

Він генерував та оцінює такий код:

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

Так що для деяких великих d він буде працювати дуже довго і забирає багато пам’яті, маючи складність O (n ^ d)



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.