Fermat Near Misses


31

Teorema terakhir Fermat mengatakan bahwa ada tidak ada yang positif, solusi integral persamaan a^n + b^n = c^nuntuk setiap n>2. Ini terbukti benar oleh Andrew Wiles pada tahun 1994.

Namun, ada banyak "nyaris celaka" yang hampir memenuhi persamaan diophantine tetapi terlewat satu. Tepatnya, mereka semua lebih besar dari 1 dan merupakan solusi integral a^3 + b^3 = c^3 + 1(urutannya adalah nilai dari setiap sisi persamaan, dalam urutan yang meningkat).

Tugas Anda diberikan n, untuk mencetak nilai pertama ndari urutan ini.

Berikut adalah beberapa nilai pertama dari urutan ini:

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

Ini adalah , jadi kode terpendek dalam byte menang!



1
Yang pertama adalah en.wikipedia.org/wiki/Taxicab_number Ramanujan . Urutan c, oeis.org/A050791 dapat membantu.
JollyJoker

Jawaban:


14

Jelly , 16 byte

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

Solusi brute-force. Cobalah 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.

8

Brachylog , 31 byte

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

Cobalah online!

Ini bukan kekuatan kasar karena ini menggunakan kendala. Ini agak lambat pada TIO (sekitar 20 detik untuk N = 5). Memakan waktu sekitar 5 detik untuk N = 5dan 13 detik untuk N = 6pada mesin saya.

Penjelasan

:{                           }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 byte

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

Pendekatan kekerasan. Dengan menyebut shebang sebagai dua, input diambil dari stdin.

Contoh Penggunaan

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

Cobalah online!


7

Mathematica, 95 byte

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

Fungsi tanpa nama mengambil argumen integer positif tunggal #dan mengembalikan daftar #bilangan bulat yang diinginkan . Ditempatkan untuk keterbacaan manusia:

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

Baris 4 menghitung semua jumlah kemungkinan kubus bilangan bulat antara 2 dan b+1 (dengan inisialisasi b=9pada baris 1) dalam urutan diurutkan. Baris 3-5 memilih dari jumlah-jumlah itu hanya jumlah-jumlah yang juga satu lebih dari satu kubus sempurna; baris 6 membatasi daftar paling banyak #nilai, yang disimpan di a. Tetapi jika daftar ini sebenarnya lebih kecil dari #nilai, Whileloop di baris 1-7 bertambah bdan mencoba lagi. Akhirnya, baris 8 menghasilkan asetelah panjang yang tepat.

Sial, versi ini lambat! Untuk satu byte tambahan, kita dapat mengubah b++di baris 7 b*=9dan membuat kode benar-benar berjalan dalam waktu yang wajar (memang, itulah cara saya mengujinya).


6

Racket 166 byte

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

Tidak Disatukan:

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

Pengujian:

(f 5)

Keluaran:

1729
1092728
3375001
15438250
121287376


5

Pari / GP, 107 byte

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

Temukan 10 solusi pertama dalam 10 detik.

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

  1. Mendapat jumlah solusi yang dibutuhkan berdasarkan argumen fungsi n

  2. Menambah c dari 3 dan untuk setiap c ^ 3 + 1 mencari a dan b dengan 1 <a <= b <c sedemikian rupa sehingga a ^ 3 + b ^ 3 = c ^ 3 + 1 . Jika ditemukan, kurangi jumlah yang diperlukan soulutions lebih lanjut n oleh 1 dan ulangi

  3. Selesai, ketika jumlah solusi yang dibutuhkan lebih lanjut (dalam n ) sama dengan 0

Sebut saja untuk mendapatkan sepuluh solusi pertama:

F(10)

Kode yang dapat dibaca (membutuhkan kurung kurawal dan ujung sebagai indikator untuk blok-notasi fungsi. Juga untuk kenyamanan mencetak semua variabel dari suatu solusi):

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

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

Selamat datang di PPCG! Saya mengambil kebebasan memberi Anda jawaban format biasa (beberapa skrip pengguna dan Stack Snippets mengandalkan itu). Ini tampaknya menghemat beberapa byte.
Dennis

Hah, Dennis, terima kasih sudah memformatnya. Dan pengurangannya sangat keren! Saya belum pernah melihat tweak spesifik ... Saya akan menerimanya sebagai versi.
Gottfried Helms

5

Python 2, 122 119 Bytes

mengapa kamu masih upvoting? Dennis menghancurkan jawaban ini;)

Selamat datang di solusi terpanjang untuk pertanyaan ini: / Saya berhasil mencukur seluruh byte dengan membuat kondisi yang lebih lama dan menghapus lekukan sebanyak mungkin.

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

Output untuk n = 5:

1729
1092728
3375001
15438250
121287376

4

TI-Basic, 90 byte

Harus ada cara yang lebih singkat ...

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 byte

Solusi brute-force lainnya:

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

Output untuk n=4:

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

Menekan c=bagian tampilan meningkatkan kode menjadi 100 byte

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

Kenapa ada 5 "end" s? Maaf saya mengerikan di matlab
ev3commander

@ ev3commander itu adalah simbol penutupan pernyataan MATLAB, "tanda kurung penutup" jika Anda mau
Rody Oldenhuis

2

C #, 188 174 187 136 byte

Versi golf berkat TheLethalCoder untuk golf code dan tipsnya yang hebat ( Coba online! ):

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

Waktu eksekusi untuk menemukan 10 angka pertama: 33.370842 detik pada laptop i7 saya (versi asli di bawah adalah 9,618127 detik untuk tugas yang sama).

Versi tidak disatukan:

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

Termasuk versi 187 byte golf sebelumnya 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--);}

Versi golf 175 byte sebelumnya (terima kasih kepada 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--);}

Versi 188 byte sebelumnya (asli) golf ( Coba online! ):

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

Waktu eksekusi untuk menemukan 10 angka pertama: 9,618127 detik di laptop i7 saya.

Ini adalah upaya pertama saya dalam C # coding ... Sedikit verbose dibandingkan dengan bahasa lain ...


3
1. Anda dapat mendeklarasikan variabel dalam klausa pertama forloop. 2. int.Parselebih pendek dari Convert.ToInt32. 3. longlebih pendek daripada doubledan lebih akurat untuk tugas ini. 4. ttidak perlu: Anda dapat menghitung nmundur 0sebagai gantinya. 5. Secara teknis saya pikir Anda perlu mematahkan dua loop setelah pencetakan, kalau-kalau ada tiga kebetulan.
Peter Taylor

2
Belum teruji: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

Anda juga dapat mengkompilasi ke Actionyang akan menyimpan byte yang digunakan dalam metode tanda tangan yaitu()=>{/*code here*/};
TheLethalCoder

Anda juga perlu sepenuhnya memenuhi syarat nama atau menambahkan using System;ke dalam byte byte
TheLethalCoder

@PeterTaylor Terima kasih atas tips hebatnya! Saya benar-benar baru di C #
Mario

0

Bahasa GameMaker, 119 byte

Kenapa show_message()begitu lama :(

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 () sementara n: jika y 3 + x 3-z3 == 1dan x3 + 1; n- = 1 x + = 1 jika y


0

Aksioma, 246 byte

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 dan hasil

-- 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             
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.