Fermat Near Misses

31

Fermats letzter Satz besagt , dass es keine positiven, integrale Lösungen für die Gleichung a^n + b^n = c^nfür jeden n>2. Dies wurde 1994 von Andrew Wiles bewiesen.

Es gibt jedoch viele "Beinaheunfälle", die die diophantische Gleichung beinahe erfüllen, sie jedoch um eins verfehlen. Genau genommen sind sie alle größer als 1 und sind integrale Lösungen von a^3 + b^3 = c^3 + 1(die Folge ist der Wert jeder Seite der Gleichung in aufsteigender Reihenfolge).

Ihre Aufgabe ist es n, die ersten nWerte dieser Sequenz auszudrucken .

Hier sind die ersten Werte der Sequenz:

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

Das ist , also gewinnt der kürzeste Code in Bytes !

Maltysen
quelle
6
oeis.org/A050794
Peter Taylor
1
Das erste ist Ramanujans en.wikipedia.org/wiki/Taxicab_number . Die Reihenfolge von c, oeis.org/A050791 kann hilfreich sein.
JollyJoker

Antworten:

14

Gelee , 16 Bytes

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

Brute-Force-Lösung. Probieren Sie es online!

*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.
Dennis
quelle
8

Brachylog , 31 Bytes

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

Probieren Sie es online!

Dies ist keine vollständige rohe Gewalt, da hier Einschränkungen verwendet werden. Dies ist bei TIO etwas langsam (ca. 20 Sekunden N = 5). Dauert ca. 5 Sekunden N = 5und 13 Sekunden N = 6auf meinem Computer.

Erläuterung

:{                           }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
Tödlich
quelle
8

Perl, 78 Bytes

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

Brute-Force-Ansatz. Couting the shebang as two, die Eingabe erfolgt von stdin.

Beispielnutzung

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

Probieren Sie es online!

primo
quelle
7

Mathematica, 95 Bytes

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

Unbenannte Funktion, die ein einzelnes positives ganzzahliges Argument verwendet #und eine Liste der gewünschten #ganzen Zahlen zurückgibt. Aus Gründen der Lesbarkeit:

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

Zeile 4 berechnet alle möglichen Summen von Ganzzahlwürfeln zwischen 2 und b+1 (mit der Initialisierung b=9in Zeile 1) in sortierter Reihenfolge. Die Zeilen 3 bis 5 wählen aus diesen Summen nur diejenigen aus, die auch mehr als ein perfekter Würfel sind. Zeile 6 beschränkt diese Liste auf höchstens #Werte, die in gespeichert sind a. Wenn diese Liste jedoch weniger als #Werte enthält, wird die WhileSchleife in den Zeilen 1 bis 7 inkrementiert bund erneut versucht. Schließlich gibt Zeile 8 aus, asobald es die richtige Länge hat.

Heilige Hölle, diese Version ist langsam! Für ein zusätzliches Byte können wir b++in Zeile 7 ändern b*=9und den Code tatsächlich in angemessener Zeit ausführen lassen (tatsächlich habe ich ihn so getestet).

Greg Martin
quelle
6

Schläger 166 Bytes

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

Ungolfed:

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

Testen:

(f 5)

Ausgabe:

1729
1092728
3375001
15438250
121287376
rnso
quelle
6

Python 2 , 102 98 Bytes

def f(n,c=2):z=c**3+1;t=z in[(k/c)**3+(k%c)**3for k in range(c*c)];return[z]*n and[z]*t+f(n-t,c+1)

Probieren Sie es online!

Dennis
quelle
5

Pari / GP, 107 Bytes

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

Findet die ersten 10 Lösungen in 10 Sek.

Ziel: a ^ 3 + b ^ 3 = c ^ 3 + 1

  1. Ermittelt die Anzahl der benötigten Lösungen durch das Funktionsargument n

  2. Erhöht c von 3 und sucht für jedes c ^ 3 + 1 a und b mit 1 <a <= b <c, so dass a ^ 3 + b ^ 3 = c ^ 3 + 1 . Wenn gefunden, verringern Sie die erforderliche Anzahl weiterer Seelenlösungen n um 1 und wiederholen Sie den Vorgang

  3. Ausführungen, wenn die Anzahl der zusätzlich benötigten Lösungen (in n ) gleich 0 ist

Nennen Sie es , um die ersten zehn Lösungen zu erhalten:

F(10)

Lesbarer Code (erfordert führende und nachfolgende geschweifte Klammern als Indikatoren für die Blocknotation der Funktion. Außerdem werden aus praktischen Gründen alle Variablen einer Lösung gedruckt):

{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 Bytes

(Verbesserung von Dennis)

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)))              
Gottfried Helms
quelle
Willkommen bei PPCG! Ich habe mir erlaubt, Ihnen Antworten im üblichen Format zu geben (einige User-Skripte und Stack-Snippets stützen sich darauf). Dies scheint ein paar Bytes zu sparen.
Dennis
Hah, Dennis, danke für die Formatierung. Und die Ermäßigung ist echt cool! Ich habe diese speziellen Änderungen noch nie gesehen ... Ich werde sie als Version in die Antwort aufnehmen.
Gottfried Helms
5

Python 2, 122 119 Bytes

Warum stimmst du immer noch zu? Dennis hat diese Antwort zerdrückt;)

Willkommen bei der längsten Lösung für diese Frage: / Ich habe es geschafft, ein ganzes Byte zu sparen, indem ich längere Bedingungen erstellt und so viele Einrückungen wie möglich entfernt habe.

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

Ausgabe für n = 5:

1729
1092728
3375001
15438250
121287376
Kade
quelle
4

TI-Basic, 90 Bytes

Es muss einen kürzeren Weg geben ...

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
Timtech
quelle
2

MATLAB, 94 Bytes

Eine andere Brute-Force-Lösung:

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

Ausgabe für n=4:

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

Durch Unterdrücken des c=Teils der Anzeige wird der Code auf 100 Byte erhöht

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
Rody Oldenhuis
quelle
Warum gibt es 5 "Enden"? Sorry, ich bin schrecklich bei Matlab
ev3commander
@ ev3commander Es ist MATLABs Abschlusssymbol, die "schließende Klammer", wenn Sie so wollen
Rody Oldenhuis
2

C #, 188 174 187 136 Bytes

Golf-Version dank TheLethalCoder für seine tollen Code-Golftipps ( Online testen ! ):

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--);};

Ausführungszeit, um die ersten 10 Zahlen zu finden: 33.370842 Sekunden auf meinem i7-Laptop (Originalversion unten war 9.618127 Sekunden für die gleiche Aufgabe).

Ungolfed-Version:

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);
    }
}

Vorherige Golfversion mit 187 Bytes 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--);}

Vorherige Golf 174 Bytes Version (danke an 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--);}

Vorherige (ursprüngliche) Golfversion mit 188 Bytes ( Online testen ! ):

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++;}}}

Ausführungszeit, um die ersten 10 Zahlen zu finden: 9,618127 Sekunden auf meinem i7-Laptop.

Dies ist mein erster Versuch in der C # -Codierung ... Ein bisschen wortreich im Vergleich zu anderen Sprachen ...

Mario
quelle
3
1. Sie können Variablen in der ersten Klausel der forSchleife deklarieren . 2. int.Parseist kürzer als Convert.ToInt32. 3. longist kürzer doubleund genauer für diese Aufgabe. 4. tist unnötig: Sie können stattdessen nbis herunterzählen 0. 5. Technisch gesehen müssen Sie nach dem Drucken zwei Schleifen durchbrechen, falls es einen dreifachen Zufall gibt.
Peter Taylor
2
Ungetestet: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--);}
Peter Taylor
Sie können auch eine kompilieren, Actiondie die in der Methodensignatur verwendeten Bytes speichert, dh()=>{/*code here*/};
TheLethalCoder
Sie müssten auch Namen vollständig qualifizieren oder using System;in die
Byteanzahl einfügen
@PeterTaylor Danke für die tollen Tipps! Ich bin völlig neu in C #
Mario
0

GameMaker-Sprache, 119 Byte

Warum ist show_message()so lang :(

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 (), während n: wenn y 3 + x 3 - z 3 == 1 und x 3 + 1; n - = 1 x + = 1 wenn y

Timtech
quelle
0

Axiom, 246 Bytes

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

ungof und Ergebnis

-- 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             
RosLuP
quelle