费马小姐失踪


31

费马的最后一个定理说,a^n + b^n = c^n对于任何一个方程,都没有正整数解n>2。1994年,安德鲁·威尔斯(Andrew Wiles)证明了这一点。

但是,有许多“差点错过”几乎满足了双色子方程,但却错过了一个。精确地,它们都大于1,并且是的整数解a^3 + b^3 = c^3 + 1(顺序是等式两边的值,按升序排列)。

将给您任务n,以打印出n此序列的第一个值。

以下是序列的前几个值:

1729, 1092728, 3375001, 15438250, 121287376, 401947273, 3680797185, 6352182209, 7856862273, 12422690497, 73244501505, 145697644729, 179406144001, 648787169394, 938601300672, 985966166178, 1594232306569, 2898516861513, 9635042700640, 10119744747001, 31599452533376, 49108313528001, 50194406979073, 57507986235800, 58515008947768, 65753372717929, 71395901759126, 107741456072705, 194890060205353, 206173690790977, 251072400480057, 404682117722064, 498168062719418, 586607471154432, 588522607645609, 639746322022297, 729729243027001

这是,因此以字节为单位的最短代码胜出!



1
第一个是Ramanujan的en.wikipedia.org/wiki/Taxicab_number。c的序列号oeis.org/A050791可能会有所帮助。
JollyJoker '16

Answers:


14

果冻,16字节

*3‘
ḊŒc*3S€ċǵ#Ç

蛮力解决方案。在线尝试!

*3‘           Helper link. Maps r to r³+1.

ḊŒc*3S€ċǵ#Ç  Main link. No arguments.

         µ    Combine the links to the left into a chain.
          #   Read an integer n from STDIN and execute the chain to the left for
              k = 0, 1, 2, ... until n matches were found. Yield the matches.
Ḋ             Dequeue; yield [2, ..., k].
 Œc           Yield all 2-combinations of elements of that range.
   *3         Elevate the integers in each pair to the third power.
     S€       Compute the sum of each pair.
        Ç     Call the helper link, yielding k³+1.
       ċ      Count how many times k³+1 appears in the sums. This yields a truthy 
              (i.e., non-zero) integer if and only if k is a match.
           Ç  Map the helper link over the array of matches.

8

Brachylog,31个字节

:{#T#>>:{:3^}aLhH,Lb+.-H,#T=,}y

在线尝试!

这不是完全的蛮力,因为它使用了约束。这在TIO上有点慢(大约20秒N = 5)。在我的机器上花费大约5秒钟,花费N = 513秒钟N = 6

说明

:{                           }y    Return the first Input outputs of that predicate
  #T                               #T is a built-in list of 3 variables
    #>                             #T must contain strictly positive values
      >                            #T must be a strictly decreasing list of integers
       :{:3^}aL                    L is the list of cubes of the integers in #T
              LhH,                 H is the first element of L (the biggest)
                  Lb+.             Output is the sum of the last two elements of L
                     .-H,          Output - 1 = H
                         #T=,      Find values for #T that satisfy those constaints

8

Perl,78个字节

#!perl -nl
grep$_<(($_+2)**(1/3)|0)**3,map$i**3-$_**3,2..$i++and$_-=print$i**3+1while$_

蛮力法。将shebang分为两个,输入来自stdin。

样品用量

$ echo 10 | perl fermat-near-miss.pl
1729
1092728
3375001
15438250
121287376
401947273
3680797185
6352182209
7856862273
12422690497

在线尝试!


7

Mathematica,95个字节

(b=9;While[Length[a=Select[Union@@Array[#^3+#2^3&,{b,b},2],IntegerQ[(#-1)^3^-1]&,#]]<#,b++];a)&

未命名函数采用单个正整数参数#并返回所需#整数的列表。隔开人类可读性:

1  (b = 9; While[
2    Length[ a =
3      Select[
4        Union @@ Array[#^3 + #2^3 &, {b, b}, 2],
5        IntegerQ[(# - 1)^3^-1] &
6      , #]
7    ] < #, b++
8  ]; a) &

第4 行按排序顺序计算2到b+1 之间的所有可能的整数立方和(b=9第1行中的初始化)。第3-5行仅从那些总和中选择比理想立方体多1个的总和。第6行将该列表限制为最多#存储在中的值a。但是,如果此列表实际上少于#值,则While第1-7行中的循环会增加b并重试。最后,第8行输出a正确的长度。

该死的这个版本太慢了!对于一个额外的字节,我们可以将b++第7行更改为b*=9并使代码实际上在合理的时间内运行(实际上,这就是我对其进行测试的方式)。


6

球拍166字节

(let((c 0)(g(λ(x)(* x x x))))(for*((i(in-naturals))(j(range 1 i))(k(range j i))#:final(= c n))
(when(=(+(g j)(g k))(+ 1(g i)))(displayln(+ 1(g i)))(set! c(+ 1 c)))))

取消高尔夫:

(define (f n)
  (let ((c 0)
        (g (λ (x) (* x x x))))
    (for* ((i (in-naturals))
           (j (range 1 i))
           (k (range j i))
           #:final (= c n))
      (when (= (+ (g j) (g k))
               (+ 1 (g i)))
        (displayln (+ 1(g i)))
        (set! c (add1 c))))))

测试:

(f 5)

输出:

1729
1092728
3375001
15438250
121287376


5

Pari / GP,107个字节

F(n)=c=2;while(n>0,c++;C=c^3+1;a=2;b=c-1;while(a<b,K=a^3+b^3;if(K==C,print(C);n--;break);if(K>C, b--,a++)))

在10秒内找到前10个解决方案。

目标: a ^ 3 + b ^ 3 = c ^ 3 + 1

  1. 通过功能参数n获取所需解决方案的数量

  2. c3增加,并为每个c ^ 3 + 1 搜索ab,其中1 <a <= b <c使得 a ^ 3 + b ^ 3 = c ^ 3 + 1。如果找到,则将所需的进一步置换n减少1 并重复

  3. 完成,当进一步需要的解决方案数(以n为单位)等于0时

调用它可获得前十个解决方案:

F(10)

可读的代码(需要使用大括号和尾部大括号作为该功能块标记的指示符。为了方便起见,还会打印解决方案的所有变量):

{F(m) = c=2;
   while(m>0,        
     c++;C=c^3+1;             
     a=2;b=c-1;                
     while(a<b,                
           K=a^3+b^3;               
            if(K==C,print([a,b,c,C]);m--;break);
            if(K>C, b--,a++);
          );
    );}

Pari / GP,93个字节

(丹尼斯改进)

F(n)=c=2;while(n,C=c^3+1;a=2;b=c++;while(a<b,if(K=a^3+b^3-C,b-=K>0;a+=K<0,print(C);n--;b=a)))              

欢迎来到PPCG!我冒昧地给您答复通常的格式(某些用户脚本和堆栈片段依赖于该格式)。似乎节省了一些字节。
丹尼斯

丹尼斯,谢谢您的格式化。减少真的很酷!我从未见过具体的调整...我将以版本的形式将其纳入答案。
Gottfried Helms

5

Python 2,122 119字节

您为什么仍在投票?丹尼斯粉碎了这个答案;)

欢迎使用这个问题的最长解决方案:/我设法通过设置更长的条件并删除尽可能多的缩进来剃掉整个字节。

x,y,z=2,3,4
n=input()
while n:
 if y**3+x**3-z**3==1and x<y<z:print z**3+1;n-=1
 x+=1
 if y<x:y+=1;x=2
 if z<y:z+=1;y=3

输出为n = 5

1729
1092728
3375001
15438250
121287376

4

TI基本(90字节)

必须有更短的方法...

Prompt N
2->X
3->Y
4->Z
While N
If 1=X³+Y³-Z³ and X<Y and Y<Z
Then
DS<(N,0
X+1->X
If Y<X
Then
2->X
Y+1->Y
End
If Z<Y
Then
3->Y
Z+1->Z
End
End

2

MATLAB,94个字节

另一个暴力解决方案:

for z=4:inf,for y=3:z,for x=2:y,c=z^3+1;if x^3+y^3==c,n=n-1;c,if~n,return,end,end,end,end,end

输出为n=4

>> n=4; fermat_near_misses    
c =
        1729
c =
     1092728
c =
     3375001
c =
    15438250

禁止c=显示部分将代码增加到100个字节

for z=4:inf,for y=3:z,for x=2:y,c=z^3+1;if x^3+y^3==c,n=n-1;disp(c),if~n,return,end,end,end,end,end

>> n=4; fermat_near_misses_cleandisp    
        1729
     1092728
     3375001
    15438250

为什么有5个“结尾”?抱歉,我在Matlab上很糟糕
ev3commander

@ ev3commander,它是MATLAB的语句结束符号,如果您愿意
则为

2

C#,188个 174 187 136字节

高尔夫球版感谢TheLethalCoder出色的高尔夫球技巧和技巧(在线尝试!):

n=>{for(long a,b,c=3;n>0;c++)for(a=2;a<c;a++)for(b=a;b<c;b++)if(a*a*a+b‌​*b*b==c*c*c+1)System‌​.Console.WriteLin‌e(‌​c*c*(a=c)+n/n--);};

查找前10个数字的执行时间:在我的i7笔记本电脑上为33,370842秒(对于同一任务,下面的原始版本为9,618127秒)。

非高尔夫版本:

using System;

public class Program
{
    public static void Main()
    {
        Action<int> action = n =>
        {
            for (long a, b, d, c = 3; n > 0; c++)
                for (a = 2; a < c; a++)
                    for (b = a; b < c; b++)
                        if (a * a * a + b‌ * b * b == c * c * c + 1)
                            System‌.Console.WriteLin‌e( c * c * (a = c) + n / n--);
        };

        //Called like
        action(5);
    }
}

以前的高尔夫187字节版本,包括 using System;

using System;static void Main(){for(long a,b,c=3,n=int.Parse(Console.ReadLine());n>0;c++)for(a=2;a<c;a++)for(b=a;b<c;b++)if(a*a*a+b*b*b==c*c*c+1)Console.WriteLin‌​e(c*c*(a=c)+n/n--);}

以前的174个字节的高尔夫球版本(感谢Peter Taylor):

static void Main(){for(long a,b,c=3,n=int.Parse(Console.ReadLine());n>0;c++)for(a=2;a<c;a++)for(b=a;b<c;b++)if(a*a*a+b*b*b==c*c*c+1)Console.WriteLin‌​e(c*c*(a=c)+n/n--);}

以前的(原始的)高尔夫188字节版本(在线尝试!):

static void Main(){double a,b,c,d;int t=0,n=Convert.ToInt32(Console.ReadLine());for(c=3;t<n;c++)for(a=2;a<c;a++)for(b=a;b<c;b++){d=(c*c*c)+1;if(a*a*a+b*b*b==d){Console.WriteLine(d);t++;}}}

查找前10个数字的执行时间:在i7笔记本电脑上为9,618127秒。

这是我第一次尝试C#编码...与其他语言相比有点冗长...


3
1.您可以在for循环的第一子句中声明变量。2. int.Parse比短Convert.ToInt32。3. longdouble该任务更短且更准确。4. t不必要:您可以倒数n0。5.从技术上讲,我认为您需要在打印后中断两个循环,以防出现三重巧合。
彼得·泰勒

2
未经测试:static void Main(){for(long a,b,c=3,n=int.Parse(Console.ReadLine());n>0;c++)for(a=2;a<c;a++)for(b=a;b<c;b++)if(a*a*a+b*b*b==c*c*c+1)Console.WriteLine(c*c*(a=c)+n/n--);}
彼得·泰勒

您也可以编译为Action,以保存方法签名中使用的字节,即()=>{/*code here*/};
TheLethalCoder

您还需要完全限定名称或将其添加using System;到字节数中
TheLethalCoder

@PeterTaylor感谢您的宝贵建议!我对C#完全
-Mario

0

GameMaker语言,119字节

为什么show_message()那么长:(

x=2y=3z=4w=argument0 while n>0{if x*x*x+y*y*y-z*z*z=1&x<y&y<z{show_message(z*z*z+1)n--}x++if y<x{x=2y++}if z<y{y=3z++}}

x,y,z = 2,3,4 n = input()而n:如果y 3 + x 3-z3 == 1和x3 + 1; n- = 1 x + = 1如果y


0

公理,246字节

h(x:PI):List INT==(r:List INT:=[];i:=0;a:=1;repeat(a:=a+1;b:=1;t:=a^3;repeat(b:=b+1;b>=a=>break;q:=t+b^3;l:=gcd(q-1,223092870);l~=1 and(q-1)rem(l^3)~=0=>0;c:=round((q-1)^(1./3))::INT;if c^3=q-1 then(r:=cons(q,r);i:=i+1;i>=x=>return reverse(r)))))

不良和结果

-- hh returns x in 1.. numbers in a INT list [y_1,...y_x] such that 
-- for every y_k exist a,b,c in N with y_k=a^3+b^3=c^3+1 
hh(x:PI):List INT==
   r:List INT:=[]
   i:=0;a:=1
   repeat
      a:=a+1
      b:=1
      t:=a^3
      repeat
          b:=b+1
          b>=a=>break
          q:=t+b^3
          l:=gcd(q-1,223092870);l~=1 and (q-1)rem(l^3)~=0 =>0 -- if l|(q-1)=> l^3|(q-1)
          c:=round((q-1.)^(1./3.))::INT
          if c^3=q-1 then(r:=cons(q,r);i:=i+1;output[i,a,b,c];i>=x=>return reverse(r))

(3) -> h 12
   (3)
   [1729, 1092728, 3375001, 15438250, 121287376, 401947273, 3680797185,
    6352182209, 7856862273, 12422690497, 73244501505, 145697644729]
                                                       Type: List Integer             
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.