Fermat Yakın Kaçırılanlar


31

Fermat'ın son teoremi, a^n + b^n = c^nherhangi bir denklem için pozitif, integral çözüm olmadığını söylüyor n>2. Bunun 1994 yılında Andrew Wiles tarafından doğru olduğu kanıtlandı.

Bununla birlikte, diofanta denklemini neredeyse karşılayan ancak tek tek özleyen birçok "yakın özle" vardır. Kesin olarak, hepsi 1'den büyüktür ve ayrılmaz çözümlerdir a^3 + b^3 = c^3 + 1(sıra, denklemin her bir tarafının değeri, sırasıyla sıralanır).

Bu dizinin nilk ndeğerlerini yazdırmak için göreviniz verilir .

Dizinin ilk birkaç değeri:

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

Bu , bayt cinsinden en kısa kod kazanır!



Yanıtlar:


14

Jöle , 16 bayt

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

Kaba kuvvet çözümü. Çevrimiçi deneyin!

*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 bayt

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

Çevrimiçi deneyin!

Kısıtlamalar kullandığından bu tam kaba kuvvet değildir. Bu, TIO'da biraz yavaş (yaklaşık 20 saniye N = 5). Makinemde yaklaşık 5 saniye N = 5ve 13 saniye sürer N = 6.

açıklama

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

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

Kaba kuvvet yaklaşımı. Shebang'ı iki olarak hesaplarken girdiler stdin'den alındı.

Örnek Kullanım

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

Çevrimiçi deneyin!


7

Mathematica, 95 bayt

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

Adsız işlev, tek bir pozitif tamsayı argümanı alarak #ve istenen #tamsayıların bir listesini döndürerek . İnsan tarafından okunabilirliği için aralıklı:

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

Satır 4, 2 ile b+1 arasındaki tüm olası tamsayı küplerinin toplamını ( b=9satır 1'de ilklendirme ile ) sıralı olarak hesaplar . 3-5 satırları bu toplamlardan sadece mükemmel bir küpten bir tane daha olanları seçer; satır 6, bu listeyi #, içinde depolanan çoğu değerle sınırlar a. Fakat eğer bu liste aslında #değerlerden daha azsa, While1-7. Satırlardaki döngü artar bve tekrar dener. Son olarak, satır 8 çıktıa , doğru uzunluk olduğunda çıkar.

Cehennem bu sürüm yavaş! Fazladan bir bayt için b++7. satırda değişiklik b*=9yapabilir ve kodun gerçekten makul bir zamanda çalışmasını sağlayabiliriz (gerçekten, bu şekilde test ettim).


6

Raket 166 bayt

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

Test yapmak:

(f 5)

Çıktı:

1729
1092728
3375001
15438250
121287376


5

Pari / GP, 107 bayt

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 saniyede ilk 10 çözümü bulur.

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

  1. N işlev argümanına göre gerekli çözüm sayısını alır.

  2. Artışlar C den 3'e ve her biri için ^ 3 ± 1 ° C aramaları bir ve b ile c, 1 <a <= b < bu şekilde bir ^ 3 + B ^ 3 = C ^ 3 + 1 . Bulunan, daha fazla soulutions gerekli sayıda azaltmak N ile 1 ve tekrar

  3. İhtiyaç duyulan ilave çözümlerin sayısı ( n cinsinden ) 0 olduğunda,

İlk on çözümü almak için onu arayın :

F(10)

Okunabilir kod (işlevin blok gösterimi için gösterge olarak öncü ve izleyen ayraçlar gerektirir. Ayrıca kolaylık sağlamak için çözümün tüm değişkenlerini yazdırır):

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

(Dennis tarafından iyileştirme)

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'ye Hoşgeldiniz! Size her zamanki formatta cevap verme özgürlüğünü aldım (bazı kullanıcı kodları ve Yığın Parçacıkları buna güveniyor). Bu birkaç bayt kurtarıyor gibi görünüyor.
Dennis,

Hah, Dennis, biçimlendirme için teşekkürler. Ve azalma gerçekten harika! Bu özel tweaks hiç görmedim ... Ben cevap olarak sürüm olarak alıyorum.
Gottfried Helms,

5

Python 2, 122 119 Bayt

neden hala ısrar ediyorsun? Dennis bu cevabı ezdi;)

Bu sorunun en uzun çözümüne hoş geldiniz: / Daha uzun koşullar alarak ve olabildiğince fazla girintiyi kaldırarak bir baytı tıraş etmeyi başardım.

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

İçin çıktı n = 5:

1729
1092728
3375001
15438250
121287376

4

TI-Basic, 90 bayt

Daha kısa bir yol olmalı ...

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 bayt

Başka bir kaba kuvvet çözümü:

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

İçin çıktı n=4:

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

c=Ekranın bir kısmını bastırmak, kodu 100 bayta çıkarır

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

Neden 5 "son" var? Üzgünüm
matlab'da berbatım

@ ev3commander MATLAB'ın açıklama kapanış sembolü, "kapanış parantezi" olacak
Rody Oldenhuis

2

C #, 188 174 187 136 bayt

Golf kodlu sürümü, TheLethalCoder sayesinde harika golf oynamak için ipuçları ve ipuçları ( Çevrimiçi deneyin! ):

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

İlk 10 rakamı bulmak için uygulama zamanı: i7 dizüstü bilgisayarımda 33.370842 saniye (aynı görev için asıl sürüm 9.618127 saniye idi).

Ungolfed versiyonu:

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

Önceki golf dahil 187 byte sürümü 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--);}

Önceki golf byte 174 byte versiyonu (Peter Taylor sayesinde):

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

Önceki (orijinal) golf 188 bayt sürümü ( Çevrimiçi deneyin! ):

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

İlk 10 numarayı bulmak için işlem zamanı: i7 dizüstü bilgisayarımda 9.618127 saniye.

Bu benim ilk C # kodlaması girişimi ... Diğer dillere kıyasla biraz ayrıntılı ...


3
1. forDöngü ilk yan tümcesinde değişkenleri bildirebilirsiniz . 2. int.Parsedaha kısa Convert.ToInt32. 3. bu görev için daha longkısa doubleve daha kesindir. 4. tgereksizdir: Eğer sayabilir naşağı 0yerine. 5. Teknik olarak, üçlü bir tesadüf olması durumunda, baskı sonrasında iki döngüyü kırmanız gerektiğini düşünüyorum.
Peter Taylor,

2
Denenmemiş: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,

Aynı zamanda Action, yöntem imzasında kullanılan baytları kaydedecek olanı derleyebilirsiniz, yani()=>{/*code here*/};
TheLethalCoder

Ayrıca tam olarak nitelendirmeniz veya using System;bayt sayımına eklemeniz gerekir
TheLethalCoder,

@PeterTaylor Harika ipuçları için teşekkürler! C # için tamamen yeniyim
Mario

0

GameMaker Dili, 119 bayt

Neden bu show_message()kadar uzun :(

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 = giriş () iken n: eğer y3 + x 3-z3 == 1 ve x3 + 1; n- = 1 x + = 1 ise y


0

Aksiyom, 246 bayt

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 ve sonuç

-- 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             
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.