Узагальнення чисел Харді – Рамануджана


12

1729 р., Відоме як число Харді – Рамануджана , - це найменше додатне ціле число, яке може бути виражене сумою двох кубів натуральних чисел двома способами ( 12^3+1^3=10^3+9^3=1729). З огляду на ціле число n(оскільки вхід у будь-якій формі є природним для обраної вами мови), знайдіть найменше додатне ціле число, яке можна виразити сумою двох позитивних цілих чисел, піднятих до цієї nпотужності двома унікальними способами. Немає використання зовнішніх джерел. Виграє мало хто з персонажів.

Зверніть увагу , що це насправді невирішена проблема для n>4. Для цих номерів дозвольте вашій програмі працювати вічно в пошуку, або помріть, намагаючись! Зробіть так, щоб у випадку нескінченного часу та ресурсів програма вирішила б проблему.


2
Ви можете (?) Захотіти вказати "суму двох натуральних чисел, піднятих до числа nS". В іншому випадку, 91(НЕ 1729) є рішенням n=3, так як 6^3+(−5)^3=4^3+3^3=91. Я дізнався про це з вашого посилання на Вікіпедію, тому, можливо, ваша довідка щодо НМ робить це непотрібним умовно. Ура!
Даррен Стоун

власне, 1це перше рішення:1 = cbrt(0.5)^3 + cbrt(0.5)^3 = ...
Джон Дворак

Дякую за пропозиції та редагуйте - я мав на увазі 2 натуральних числа!
Бен Рейх

1
@JanDvorak, га, так. Маючи це R еа!
Даррен Стоун

Ви кажете " знайти найменше додатне ціле число, яке" ... як би є одне - але для будь-якого n > 4 існування таких чисел є невирішеною проблемою . Можливо, вам слід сказати «знайти найменше додатне ціле число ( якщо таке є ), що» ... Можливо, що «відповіді» - це непереривні петлі, які нічого не знаходять.
res

Відповіді:


3

APL  45  41

{⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1}

Коротша, але повільна версія 41 символу:

{⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⍺:⍺⋄⍵∇⍨⍺+1}

Ви можете спробувати його в Інтернеті , просто вставити функцію та викликати її цифрою:

      {⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 2
50
      {⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 3
1729

(Але алгоритм досить тупий, не чекайте, що онлайн-перекладач обчислить n = 4)

Відповідь для n = 2 - 50 = 5² + 5² = 7² + 1², оскільки його число, яке "може бути виражене сумою двох квадратів натуральних чисел - не говорить по-різному - двома способами".

Якщо ви хочете додати виразний пункт, просто змініть його (v∘.≤v)на (v∘.<v)таку ж кількість символів, і n = 2 стає 65:

      {⍺←1⋄2≤+/,⍺=(v∘.<v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 2
65

Я б'ю GolfScript? Не може бути !!


приємно! І я мав на увазі окремі цілі числа, але я не вказував, так що більше потужності для вас! Назад до таблиці для малювання GolfScript ...
Бен Рейх

2

Рубі, 132

n=$*[r=0].to_i;while r+=1
r.times{|a|r.times{|b|next if
a**n+b**n!=r;r.times{|c|r.times{|d|puts(r)if
c**n+d**n==r&&a!=c&&a!=d}}}}end

Передати nяк аргумент командного рядка. Перший рядок до stdout- це рішення.

Оптимізовано для коду-гольфу, а не продуктивності. (Працює правильно. Але повільно. Робить більше роботи, ніж потрібно.)


Ось довша, трохи швидша програма С. Той самий правильний, але жахливий алгоритм. (Мені справді потрібно вивчити більше теорії!)

Перевірено на n= 2, n= 3.

С, 234

#include<stdio.h>#include<math.h>
r,a,b,c,d;main(n){scanf("%d",&n);while(++r){for(a=0;a<r;++a){for(b=a;b<r;++b){if(pow(a,n)+pow(b,n)!=r)continue;for(c=a+1;c<r;++c){for(d=0;d<r;++d){if(pow(c,n)+pow(d,n)==r&&a!=d)printf("%d\n",r);}}}}}}

Версія C бере nна себе stdin. Як зазначено вище, перший рядок до stdout- це рішення.


1

GolfScript 53

1\.{;\).,{}@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)

Введення - це початкове число на стеку. Число вгорі стека в кінці - це відповідь. Я поясню це детальніше, коли отримаю можливість.

Напр

{1\.{;\).,@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)}:f
2 f -> 25 
3 f -> 1729

Зараз це досить повільно. Він також нараховує 0(так що 25 - це відповідь n=2, оскільки 25=5^2+0^2=3^2+4^2. Щоб не рахувати 0, додайте два символи (;після першого,

1\.{;\).,(;{}@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)

Щоб знайти це 2 f=65, оскільки65=8^2+1^2=5^2+6^2


1

GolfScript (30 символів)

:N{).,{)N?}%:P{1$\-P?)},,3<}do

Зауважте: це досить повільно, тому що це швидше пошук, а не щось елегантне, як черга черговості. Найелегантніше в цьому - повторне використання Nв якості нижньої межі пошуку: це справедливо тому, що 1^N + 2^N > Nдля всіх N.

Бере Nна стек, залишає відповідний номер таксабо на стосі. Щоб взяти Nз stdin, наперед ~.

Наведена вище версія дозволяє x^N + x^N(так для N=2цього дає 50). Щоб вимагати додавання виразних чисел (даючи 65натомість), змініть 3на 4. Щоб дозволити 0^N + x^N(дати 25), видаліть )безпосередньо раніше N?.


0

Математика, 58 чол

Дуже повільне рішення з використанням функції генерації:

0//.i_/;(D[Sum[x^(n^#),{n,1,i}]^2,{x,i}]/.x->0)/i!<4:>i+1&
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.