Hardy–Ramanujan数泛化


12

1729,称为Hardy–Ramanujan数,是可以用两种方式表示为两个正整数立方体的和的最小正整数12^3+1^3=10^3+9^3=1729。给定一个整数n(以您选择的语言所自然使用的任何形式作为输入),找到最小的正整数,可以将其表示为n以两种独特方式升为幂的两个正整数之和。不使用外部资源。最少的角色获胜。

注意,这实际上是一个未解决的问题n>4。对于这些数字,让您的程序在搜索中永远运行,否则就死不了!使其具有足够的时间和资源,以便程序可以解决该问题。


2
你可能(?)要指定“两者之和的正整数提高到n次方”。否则,911729)是的解决方案n=3,因为6^3+(−5)^3=4^3+3^3=91。我是从您的Wikipedia链接中学到的,所以也许您的HM参考文献按照惯例没有必要这样做。干杯!
达伦·斯通

实际上,1第一个解决方案是:1 = cbrt(0.5)^3 + cbrt(0.5)^3 = ...
John Dvorak

感谢您的建议和编辑-我的意思是2个正整数!
Ben Reich

1
@JanDvorak,哈,是的。保持它[R EAL!
Darren Stone

你说“ 找到最小的正整数” ......,仿佛有一个-但对于任何ñ > 4,这样的数字的存在是一个未解决的问题。也许您应该说“找到最小的正整数(如果有)”……“答案”可能是无穷无尽的循环。
res

Answers:


3

杀伤人员地雷 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²,因为它的数字“可以表示为两个正整数的平方的总和,但不能说不同”。

如果要添加distinctary子句,只需将更(v∘.≤v)改为(v∘.<v),字符数相同,并且n = 2变为65:

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

我在打高尔夫球吗?不能!


真好!我的意思是不同的整数,但是我没有指定,所以您拥有更多的能力!回到GolfScript绘图板...
Ben Reich

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。

C,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版本需要nstdin。如上所述,stdout解决方案的第一行。


1

高尔夫脚本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标准输入取而代之,请前置~

上面的版本允许x^N + x^N(因此N=2提供50)。要要求添加不同的数字(65取而代之),请将更改34。要允许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&
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.