Обобщение чисел Харди – Рамануджана

12

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

Обратите внимание, что это на самом деле нерешенная проблема для n>4. Для этих чисел пусть ваша программа будет работать вечно в поиске или умрете, пытаясь! Сделайте так, чтобы при наличии бесконечного времени и ресурсов программа решала проблему.

Бен Райх
источник
2
Вы можете (?) Указать «сумму двух натуральных чисел, возведенных в nстепень». В противном случае 91(не 1729) является решением для n=3, так как 6^3+(−5)^3=4^3+3^3=91. Я узнал об этом из вашей ссылки на Википедию, так что, возможно, ваша ссылка на HM делает это ненужным по соглашению. Ура!
Даррен Стоун
на самом деле, 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- это решение.

Оптимизирован для кода-гольфа, а не производительности. (Работает правильно. Но медленно. Делает больше, чем нужно.)


Вот более длинная, немного более быстрая C-программа. Тот же правильный, но ужасный алгоритм. (Мне действительно нужно больше изучать теорию!)

Проверено на 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, добавьте 2 символа (;после первого,

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из стандартного ввода, prepend ~.

Версия выше позволяет x^N + x^N(так для N=2этого дает 50). Чтобы требовать добавления различных чисел ( 65вместо того, 3чтобы давать ), измените на 4. Чтобы разрешить 0^N + x^N(давать 25), удалите )непосредственно перед N?.

Питер Тейлор
источник
0

Mathematica, 58 символов

Очень очень медленное решение с использованием функции генерации:

0//.i_/;(D[Sum[x^(n^#),{n,1,i}]^2,{x,i}]/.x->0)/i!<4:>i+1&
alephalpha
источник