Pisagor Üçlü Dizisi


33

Bir Pisagor üç üç pozitif tamsayılar olduğu böyle, a, b ve c, oluşan 2 + B 2 = C 2 . Böyle bir üçlü genellikle yazılır (a, b, c) ve iyi bilinen bir örnek (3, 4, 5). (A, b, c) bir Pisagor üçlüsü ise, herhangi bir pozitif tamsayı k için de (ka, kb, kc) olur. İlkel bir Pisagorlu üçlü, içinde a, b ve c'nin kopya olduğu bir üçlüdür .

Bu bilgiyi kullanarak, en az üçlü uzunlukları birlikte zincirleyerek bir dizi oluşturabiliriz; buradaki sekanstaki bir sonraki eleman, uzunluklarını en küçük olan önceki elemanı içeren en küçük ilkel Pisagor üçlüünün hipotenüsüdür (en büyük sayı).

En küçük ilkel Pisagor üçlü (3, 4, 5) ile başlayın. Dizi ile başlar 3ve hipotenüs (dizideki bir sonraki eleman) olur 5. Öyleyse en küçük ilkel Pisagorlu 5bacağını üçlü olarak bulun ve siz de elde edin (5, 12, 13). Böylece dizi devam ediyor 13.

Ya diziyi sonsuza dek çıkar ya da bir tamsayı girişi alır nve ndizinin ilk öğelerini sıfır ya da dizine eklenir.

En azından ve dahil olmak üzere çıktıları desteklemeniz gerekir 28455997, ancak kullandığınız veri türünün sınırı aniden yükseltildiyse, bu yeni sınır için çalışması gerekir. Yani bir sayı listesini zorla yazamazsınız.

3
5
13
85
157
12325
90733
2449525
28455997
295742792965
171480834409967437
656310093705697045
1616599508725767821225590944157
4461691012090851100342993272805
115366949386695884000892071602798585632943213
12002377162350258332845595301471273220420939451301220405

OEIS A239381

Benzer diziler (bunları çıkarmayın!):


Herhangi bir zaman sınırı var mı?
Loovjo

@Loovjo Hayır, ancak çıktılarınızın doğru olduğunu bilmeniz / kanıtlamanız gerekir. Çıktının sonradan değiştiği bazı benzer diziler vardır 12325.
mbomb007

Düşündüğüm benzer dizilişe göre farklılıklar var 85... bir sonraki dönem 3613(henüz ne olduğunu tahmin edebilir misiniz?)
Neil

@Neil Çabuk arama , Pisagor spirali A053630'u verir . Yine de bu iki mücadeleye atıfta bulundum, çünkü uygulamamı yapmaya çalışırken yanlışlıkla bu iki sekansa veya onlara benzer şekilde ulaştım.
mbomb007

1
Gerçekten, daha uyanık olsaydım, kendim daha yeni
Neil

Yanıtlar:


11

Jöle , 19 bayt

o3ṄÆF*/€ŒPP€²+Ṛ$HṂß

Sonsuz bir diziye yeniden yönlendirerek @ Dennis sayesinde bir bayt kurtardı.

Girdi ve argüman almaz, ardından her bir terimi hesapladığı sırada yazdırarak diziyi sınırsız biçimde çıkarır. Bu yöntem, asal çarpanlara bağlı olduğundan sayılar büyüdükçe yavaşlar.

Çevrimiçi deneyin!

Bu, cari terimin asıl güç faktörleştirmesini hesaplayarak bir sonraki terimi hesaplar. 12325 için bu {5 2 , 17, 29}. Pisagor üçlülerini hesaplamak için Öklid formülü varyantı { a , b , c },

formül

burada m > n ve üçlü ilkeldir; i ve m , n eşittir .

, 12325 sonraki ilkel kök hesaplamak bulmak için m ve n, öyle ki mn = 12325 ve tercih m , n, o kadar gcd (yani m , n ) = 1 O tüm çiftleri oluşturmak m , n, {5 tüm alt kümeleri oluşturarak 2 , 17, 29} ve {1, 25, 17, 29, 425, 725, 493, 12325} olan alt grupların her birinin ürününün bulunması. Daha sonra 12325'i her değere bölün ve çiftin her biri m , n olacak şekilde eşleştirin . Her çifti kullanarak c için formülü hesaplayın ve en az 90733 olan minimum değerini alın.

  • Önceki yöntem, 228034970321525477033478437478475683098735674620405573717049066152557390539189785244849203205 tarihinden sonraki terimi belirlemek için başarısız oldu. Yeni yöntem daha yavaştır ancak her zaman çalışacaktır çünkü en düşük hipoteni bulmak için tüm çift çiftleri test eder.

açıklama

o3ṄÆF*/€ŒPP€²+Ṛ$HṂß  Main link. Input: 0 if none, else an integer P
o3                   Logical OR with 3, returns P if non-zero else 3
  Ṅ                  Println and pass the value
   ÆF                Factor into [prime, exponent] pairs
     */€             Reduce each pair using exponentation to get the prime powers
        ŒP           Powerset of those
          P€         Product of each
            ²        Square each
               $     Monadic chain
             +         Add vectorized with
              Ṛ        the reverse
                H    Halve
                 Ṃ   Minimum
                  ß  Call recursively on this value

Vay, bu gerçekten hızlı!
mbomb007

1
o3ṄÆfµṪ,P²SHßsonsuz çıktı ile bir bayt kazandırır.
Dennis,

5

Brachylog , 36 bayt

3{@wB:?>:^a+~^=C:B:?:{$pd}ac#d,C:1&}

Çevrimiçi deneyin!

TIO çıkışı boşaltmadan önce programın zaman aşımına uğramasını beklemelisiniz (1 dakika). SWI-Prolog’ın REPL’inde bu değeri bulur bulmaz basar.

Bu, diziyi sonsuza dek yazdırır.

Çevrimdışı SWI-Prolog’un tercümanı üzerinde birkaç dakika bekledikten 90733sonra elde ettim 12325. Bu noktadan sonra onu durdurdum.

Pisagor üçlülerini bulmak için kısıtlamalar kullandığı için bu tam bir kaba güç değil, ancak açıkça hız için optimize edilmemiş olmasına rağmen.

açıklama

3{                                 }    Call this predicate with 3 as Input
  @w                                    Write the Input followed by a line break
    B:?>                                B > Input
           +                            The sum...
        :^a                             ...of Input^2 with B^2...
            ~^                          ...must equal a number which is itself a square
              =C                        Assign a fitting value to that number and call it C
               C:B:?:{$pd}a             Get the lists of prime factors of C, B and Input
                                          without duplicates
                           c#d,         Concatenate into a single list; all values must be
                                          different
                               C:1&     Call recursively with C as Input

4

Perl, 73 bayt

for($_=3;$_<1e9;$_=$a**2+$b**2){$a++until($b=($_+$a**2)**.5)==($b|0);say}

Tüm Pisagor Üçlüleri bazı tamsayılar için a²+b²=c²tatmin a=r(m²-n²), b=2rmn, c=r(m²+n²)edicidir r,m,n. Ne zaman r=1ve m,ntam olarak biri 2 ile bölünebiliyorsa, bir koprime sahipseniz, o zaman hepsi çift koprime a,b,colan ilkel bir üçlüdür a,b,c.

Bazı Verilen Bu düşünceyle, birlikte a, ben en küçük hesaplamak için bir kaba kuvvet algoritması kullanır nböyle a²-n²yani bir karedir . O zaman, ceşittir n²+m².


Açıklamanızdaki olası yazım hatası: nbunun gibi a+n²bir kare ararsınız.
Neil

2

Python 3, 178 bayt

from math import*
p,n=[3,5],int(input())
while len(p)<n:
 for i in range(p[-1],p[-1]**2):
  v=sqrt(i**2+p[-1]**2)
  if v==int(v)and gcd(i,p[-1])==1:
   p+=[int(v)];break
print(p)

Bu temelde sadece kaba kuvvet algoritmasıdır ve bu nedenle çok yavaştır. Girdi olarak çıkacak terim miktarını alır.

Bu algoritmanın doğruluğu hakkında% 100 emin değilim, program yeterli olduğunu düşündüğüm ilk bacağın diğer bacağına kadar kontrol eder, ancak matematiği yapmadım.

Tekrar dene! (Eski) (Lütfen 10'dan büyük numaralar için deneyin, çok yavaşlar)


Python 3.5'e geçip kullanabilirsiniz math.gcd. Ayrıca, p+=[...]yerine kullanın p.append(...). Ve <2yerine ==1. Ve ifhepsi bir satırda olabilir.
mbomb007

1
Önerdiğim son 2 geliştirmeyi hala yapabilirsin.
mbomb007


Loovjo, önerileri kullanarak kodunu golf oynayacak mısın?
mbomb007

2

MATL , 27 bayt

Ii:"`I@Yyt1\~?3MZdZdq]}6MXI

Bu, dizinin ilk terimlerini üretir. Giriş 0 tabanlıdır.

Kod çok verimsiz. Çevrimiçi derleyici, daha büyük olan girişler için zaman aşımına uğradı 5. Girdi 6bir buçuk dakika çevrimdışı kaldı (ve 907336. terim için doğru olanı üretti ).

Çevrimiçi deneyin!

I            % Push 3 (predefined value of clipboard I)
i            % Input n
:"           % For each (i.e. execute n times)
  `          %   Do...while
    I        %     Push clipboard I. This is the latest term of the sequence
    @        %     Push iteration index, starting at 1
    Yy       %     Hypotenuse of those two values
    t1\      %     Duplicate. Decimal part
    ~?       %     If it is zero: we may have found the next term. But we still
             %     need to test for co-primality
      3M     %       Push the two inputs of the latest call to the hypotenuse 
             %       function. The stack now contains the hypotenuse and the
             %       two legs
      ZdZd   %       Call GCD twice, to obtain the GCD of those three numbers
      q      %       Subtract 1. If the three numbers were co-prime this gives
             %       0, so the do...while loop will be exited (but the "finally" 
             %       part will be executed first). If they were not co-prime  
             %       this gives non-zero, so the do...while loop proceeds 
             %       with the next iteration
    ]        %     End if
             %     If the decimal part was non-zero: the duplicate of the 
             %     hypotenuse that is now on the top of the stack will be used
             %     as the (do...while) loop condition. Since it is non-zero, 
             %     the loop will proceed with the next iteration
  }          %   Finally (i.e. execute before exiting the do...while loop)
    6M       %     Push the second input to the hypotenuse function, which is
             %     the new term of the sequence
    XI       %     Copy this new term into clipboard I
             %   Implicitly end do...while
             % Implicitly end for each
             % Implicitly display the stack, containing the sequence terms

2

Raket 106 bayt

(let p((h 3))(println h)(let p2((i 1))(define g(sqrt(+(* h h)(* i i))))(if(integer? g)(p g)(p2(add1 i)))))

Ungolfed:

(define (f)
  (let loop ((h 3))
    (let loop2 ((i 1))
      (define g (sqrt (+(* h h) (* i i))))
      (if (not(integer? g))
          (loop2 (add1 i))
          (begin (printf "~a ~a ~a~n" h i g)
                 (loop g))))))

Test yapmak:

(f)

Golf versiyonunun çıktısı:

3
5
13
85
157
12325
12461
106285
276341
339709
10363909
17238541

Ungolfed versiyonunun çıktısı:

3 4 5
5 12 13
13 84 85
85 132 157
157 12324 12325
12325 1836 12461
12461 105552 106285
106285 255084 276341
276341 197580 339709
339709 10358340 10363909
10363909 13775220 17238541

(Makinemde bundan sonra hata)


Golf kodu sadece sekans hipotenüsünü basar. Ungolfed sürümleri, söz konusu olmayan üçüzleri açıklığa kavuşturmak için üçünü de gösterir.
rnso,


1

PHP, 139 bayt

for($k=3;$i=$k,print("$k\n");)for($j=$i+1;($k=sqrt($m=$i*$i+$j*$j))>(int)$k||gmp_intval(gmp_gcd(gmp_gcd((int)$i,(int)$j),(int)$k))>1;$j++);

Yukarıdaki kod 32-bit sistemlerde 28455997'den sonra kesilir. Daha yüksek sayılar gerekirse, 156 bayt olur:

for($k=3;$i=$k,print("$k\n");)for($j=$i+1;!gmp_perfect_square($m=bcadd(bcpow($i,2),bcpow($j,2)))||gmp_intval(gmp_gcd(gmp_gcd($i,$j),$k=bcsqrt($m)))>1;$j++);

1

Java 8, 133 Bayt

-25 bayt mil sayesinde Math.pow yerine n * n kullanımı (n, 2)

Millerce -24 bayt , işlem sırasına bağlı olarak () işlevini kullanarak, veri tipini değiştirerek süre yerine döngüleri kullanmak

()->{long b=3,c,n;for(;;){for(n=1;;n++){c=b+2*n*n;double d=Math.sqrt(c*c-b*b);if(d==(int)d&b<d){System.out.println(b);break;}}b=c;}};

Gerçeği kullanır

ilişki

m> n> 0 olan herhangi bir tamsayı çifti için bu nedenle C, A artı 2 (N) 2'ye eşittir . Yukarıdaki fonksiyon, Pisagor'un ikinci elemanını bir tamsayı ve birinci elemandan daha büyük bir tamsayı yaparken, bu ilişkiyi sağlayan en düşük N değerini bulur. Ardından, ilk öğenin değerini üçüncü öğeye ayarlar ve güncellenmiş ilk öğeyle tekrar eder.

Ungolfed:

void printPythagoreanTriples() {
    long firstElement = 3, thirdElement, n;
    while (true) {
        for (n = 1; ; n++) {
            thirdElement = firstElement + (2 * n * n);
            double secondElement = Math.sqrt(thirdElement * thirdElement - firstElement * firstElement);
            if (secondElement == (int) secondElement && firstElement < secondElement) {
                System.out.println("Found Pythagorean Triple [" +
                        firstElement + ", " +
                        secondElement + ", " +
                        thirdElement + "]");
                break;
            }
        }
        firstElement = thirdElement;
    }
}

Ideone!

* İdeone, zaman sınırı nedeniyle gerekli olan son elemanı basmaz, ancak programın mantığını ve asılsız versiyonunu (28455997'yi, önceki Pisagor üçlüsünün üçüncü elemanı olarak basar) gördüğünüz gibi yazdırır. sonraki), değerler daha yüksek bir zaman sınırı ile yazdırılır.


Kullanmak Could n*nyerine Math.pow(n,2)?
mil

Bunu neden düşünmedim bilmiyorum ... Hemen ekleyeceğim. Thank you @miles
Mario Ishac

for133 byte'a düşürmek için döngüler kullanmaya başladım()->{long b=3,c,n;for(;;){for(n=1;;n++){c=b+2*n*n;double d=Math.sqrt(c*c-b*b);if(d==(int)d&b<d){System.out.println(b);break;}}b=c;}};
miller

1

Python 3.5, 97 bayt

Sonra yanlış çıkış 28455997Kayan nokta veri tipinin sınırları nedeniyle . sqrtFonksiyon yeterince iyi değil, ama kesinlik sihirli artmış olsaydı, o iş olur.

Anlaması oldukça basit. cBiri yerine iki ile artırmak , çalışma süresini yarıya indirir ve öğelerin her zaman tek olduğu için yalnızca tek sayıların kontrol edilmesi gerekir.

import math
c=a=3
while 1:
	c+=2;b=(c*c-a*a)**.5;i=int(b)
	if math.gcd(a,i)<2<a<b==i:print(a);a=c

Çevrimiçi deneyin

Program Ideone'da çalıştırılamaz, çünkü Ideone Python 3.4 kullanıyor


Çıktının daha uzun süre doğru kalması için kullanmak zorunda kalırdım decimal:

import math
from decimal import*
c=a=3
while 1:
	c+=2;b=Decimal(c*c-a*a).sqrt();i=int(b)
	if i==b>a>2>math.gcd(a,i):print(a);a=c

Çevrimiçi deneyin

Süresiz olarak kesin kalmak için, böyle korkunç bir şey yapabilirim ( her bir yinelemenin gerektirdiği hassasiyeti artırarak :

import math
from decimal import*
c=a=3
while 1:
	c+=2;b=Decimal(c*c-a*a).sqrt();i=int(b);getcontext().prec+=1
	if i==b>a>2>math.gcd(a,i):print(a);a=c



1

APL (NARS), 169 karakter, 338 bayt

h←{{(m n)←⍵⋄(mm nn)←⍵*2⋄(2÷⍨nn+mm),(2÷⍨nn-mm),m×n}a⊃⍨b⍳⌊/b←{⍵[2]}¨a←a/⍨{(≤/⍵)∧1=∨/⍵}¨a←(w÷a),¨a←∪×/¨{k←≢b←1,π⍵⋄∪{b[⍵]}¨↑∪/101 1‼k k}w←⍵}⋄p←{⍺=1:⍵⋄⍵,(⍺-1)∇↑h ⍵}⋄q←{⍵p 3x}

q argümanı olarak 14'e kadar test edin:

  q 1
3 
  q 2
3 5 
  q 10
3 5 13 85 157 12325 90733 2449525 28455997 295742792965 
  q 12
3 5 13 85 157 12325 90733 2449525 28455997 295742792965 171480834409967437 656310093705697045 
  q 13
3 5 13 85 157 12325 90733 2449525 28455997 295742792965 171480834409967437 656310093705697045 
  1616599508725767821225590944157 
  q 14
NONCE ERROR
  q 14
  ∧

Bu, argümanının tüm bölenlerini bulur ...

∪×/¨{k←≢b←1,π⍵⋄∪{b[⍵]}¨↑∪/101 1‼k k}

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.