Pythagorean Triple Sequence


33

พีทาโกรัสสามประกอบด้วยสามจำนวนเต็มบวก, B และ C เช่นว่า2 + B 2 c = 2 ทริปเปิลดังกล่าวเขียนขึ้นโดยทั่วไป (a, b, c) และตัวอย่างที่รู้จักกันดีคือ (3, 4, 5) ถ้า (a, b, c) เป็นพีทาโกรัสสามดังนั้นก็คือ (ka, kb, kc) สำหรับจำนวนเต็มบวก k ใด ๆ พีทาโกรัสดั้งเดิมสามซึ่งเป็นหนึ่งใน A, B และ C มีcoprime

การใช้ความรู้นี้เราสามารถสร้างลำดับโดยการผูกมัดความยาวน้อยที่สุดของสามอย่างด้วยกันโดยที่องค์ประกอบถัดไปในลำดับคือด้านตรงข้ามมุมฉาก (จำนวนมากที่สุด) ของ Pythagorean ดั้งเดิมที่เล็กที่สุดสามตัว

เริ่มด้วย Pythagorean ดั้งเดิมที่เล็กที่สุดสาม (3, 4, 5) ลำดับเริ่มต้นด้วย3และด้านตรงข้ามมุมฉาก (องค์ประกอบถัดไปในลำดับ) 5เป็น จากนั้นหา Pythagorean ดั้งเดิมที่เล็กที่สุดสามเท่าด้วย5ขาและคุณจะได้รับ (5, 12, 13) 13ดังนั้นลำดับยังคงมี

เอาท์พุทลำดับนั้นตลอดไปหรือรับอินพุตจำนวนเต็มnและเอาท์พุทnองค์ประกอบแรกของลำดับทั้งศูนย์หรือหนึ่งดัชนี

คุณจำเป็นต้องสนับสนุนเอาต์พุตอย่างน้อยผ่านและรวมถึง28455997แต่ถ้าขีด จำกัด ของชนิดข้อมูลที่คุณใช้ถูกยกขึ้นอย่างกระทันหันมันจะต้องทำงานกับขีด จำกัด ใหม่นั้น ดังนั้นคุณจึงไม่สามารถเขียนรายการหมายเลขได้ยาก

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

OEIS A239381

ลำดับที่คล้ายกัน (อย่าส่งออกสิ่งเหล่านี้!):


มีการ จำกัด เวลาหรือไม่?
Loovjo

@ Loovjo ไม่ แต่คุณควรรู้ / พิสูจน์ว่าผลลัพธ์ของคุณถูกต้อง มีบางซีเควนซ์ที่คล้ายกันซึ่งเอาต์พุตแตกต่างกันหลังจาก12325นั้น
mbomb007

ลำดับที่คล้ายกันที่ฉันคิดแตกต่างหลังจาก85... เทอมถัดไปของมันคือ3613(คุณสามารถเดาได้ไหมว่ามันคืออะไร?)
Neil

@Neil การค้นหาอย่างรวดเร็วทำให้A053630เป็นเกลียวปิทาโกรัส ฉันอ้างถึงความท้าทายทั้งสองเนื่องจากในขณะที่กำลังพยายามทำให้การใช้งานของฉันประสบความสำเร็จฉันก็ไปถึงทั้งสองลำดับหรือคล้ายคลึงกับพวกเขา
mbomb007

1
จริง ๆ แล้วถ้าฉันตื่นตัวมากขึ้นฉันก็แค่มองหามันเอง ...
นีล

คำตอบ:


11

เยลลี่ขนาด 19 ไบต์

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

บันทึกเป็นไบต์ด้วย @ Dennisโดยการปรับโครงสร้างตามลำดับที่ไม่สิ้นสุด

ไม่รับอินพุตและอาร์กิวเมนต์จากนั้นเอาต์พุตลำดับไม่สิ้นสุดโดยการพิมพ์แต่ละเทอมตามที่คำนวณได้ วิธีนี้ช้าลงเมื่อตัวเลขมีขนาดใหญ่ขึ้นเนื่องจากขึ้นอยู่กับการแยกตัวประกอบเฉพาะ

ลองออนไลน์!

สิ่งนี้คำนวณคำถัดไปโดยการคำนวณการแยกตัวประกอบกำลังไฟฟ้าหลักของคำปัจจุบัน สำหรับ 12325 นี่คือ {5 2 , 17, 29} มีสูตรของยูคลิดที่แตกต่างกันสำหรับการคำนวณพีทาโกรัสสามอเนกประสงค์ { a , b , c },

สูตร

โดยที่m > nและสามเป็นแบบดั้งเดิม iff mและnเป็น coprime

ในการคำนวณรากแบบดั้งเดิมถัดไปจาก 12325 ค้นหาmและnเช่นนั้นmn = 12325 และเลือกm , nเพื่อให้ gcd ( m , n ) = 1 จากนั้นสร้างคู่ทั้งหมดของm , nโดยการสร้างเซตย่อยทั้งหมดของ {5 2 , 17, 29} และค้นหาผลิตภัณฑ์ของแต่ละชุดย่อยซึ่งคือ {1, 25, 17, 29, 425, 725, 493, 12325} แล้วหาร 12325 โดยแต่ละค่าและทั้งคู่เพื่อให้แต่ละคู่เป็นเมตร , n คำนวณสูตรสำหรับcโดยใช้แต่ละคู่และทำขั้นต่ำซึ่งคือ 90733

  • วิธีก่อนหน้านี้ล้มเหลวในการกำหนดเทอมถัดไปหลังจาก 228034970321525477033478437478475683098735674620405573740480667707049066152557390539189785244849203205 วิธีการก่อนหน้านี้ล้มเหลวในการกำหนดเทอมถัดไปหลังจาก 228034970321525477033478437478475683098735674620405573770490661525573905701898585244849203205 วิธีการใหม่จะช้ากว่า แต่จะใช้ได้เสมอเนื่องจากจะทดสอบ coprimes ทุกคู่เพื่อค้นหาด้านตรงข้ามมุมฉากที่น้อยที่สุด

คำอธิบาย

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

ว้าวนี่เร็วจริงๆ!
mbomb007

1
o3ṄÆfµṪ,P²SHßด้วยเอาต์พุตไม่สิ้นสุดจะบันทึกเป็นไบต์
เดนนิส

5

Brachylogขนาด 36 ไบต์

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

ลองออนไลน์!

คุณต้องรอให้โปรแกรมหมดเวลา (1 นาที) ก่อนที่ TIO จะล้างข้อมูลเอาต์พุต ใน SWL-Prolog's REPL สิ่งนี้จะพิมพ์ทันทีที่พบค่า

นี้จะพิมพ์ลำดับตลอดไป

หลังจากสองสามนาทีในล่ามของ SWI-Prolog ฉันได้รับ90733หลังจาก12325นั้น ฉันหยุดมันหลังจากจุดนี้

นี่ไม่ใช่สัตว์เดรัจฉานที่สมบูรณ์เพราะมันใช้ข้อ จำกัด ในการค้นหาพีทาโกรัสถึงแม้ว่ามันจะไม่เหมาะสำหรับความเร็ว

คำอธิบาย

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 ไบต์

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

ทั้งหมดพีทาโกรัสอเนกประสงค์a²+b²=c²ความพึงพอใจสำหรับจำนวนเต็มบางa=r(m²-n²), b=2rmn, c=r(m²+n²) r,m,nเมื่อr=1และm,nมี coprime กับว่าหนึ่งถูกหารด้วย 2 จากนั้นa,b,cเป็นดั้งเดิมสามที่a,b,cมีทั้งหมด coprime คู่

กับในใจให้บางaผมใช้อัลกอริทึมแรงเดรัจฉานในการคำนวณที่มีขนาดเล็กnดังกล่าวว่าเป็นตารางคือa²-n² จากนั้นจะมีค่าเท่ากับcn²+m²


พิมพ์ผิดที่เป็นไปได้ในคำอธิบายของคุณ: คุณค้นหาnเช่นว่าa+n²เป็นตาราง
Neil

2

Python 3, 178 ไบต์

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)

นี่เป็นเพียงอัลกอริทึมกำลังดุร้ายและช้ามาก ใช้ปริมาณของข้อกำหนดเพื่อส่งออกเป็นอินพุท

ฉันไม่แน่ใจ 100% เกี่ยวกับความถูกต้องของอัลกอริธึมนี้โปรแกรมจะตรวจสอบขาอีกข้างหนึ่งถึงขาแรกกำลังสองซึ่งฉันเชื่อว่าเพียงพอ แต่ฉันยังไม่ได้ทำคณิตศาสตร์

ลองใช้กับ repl.it! (ล้าสมัย) (โปรดอย่าลองสำหรับตัวเลขที่มากกว่า 10 จะช้ามาก)


คุณสามารถเปลี่ยนไปใช้ Python 3.5 และใช้งานmath.gcdได้ นอกจากนี้ยังใช้แทนp+=[...] p.append(...)และแทน<2 ==1และifทั้งหมดสามารถอยู่ในหนึ่งบรรทัด
mbomb007

1
คุณยังสามารถทำการปรับปรุง 2 ครั้งล่าสุดที่ฉันแนะนำ
mbomb007


ถ้าอย่างนั้นคุณจะเขียนโค้ดของคุณโดยใช้คำแนะนำหรือไม่?
mbomb007

2

MATL , 27 ไบต์

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

สิ่งนี้สร้างเงื่อนไขแรกของลำดับ อินพุตเป็นแบบอิง 0

รหัสไม่มีประสิทธิภาพมาก 5ครั้งที่คอมไพเลอร์ออนไลน์ออกมาให้มากขึ้นกว่าปัจจัยการผลิต อินพุต6ใช้เวลาหนึ่งนาทีครึ่งออฟไลน์ (และสร้างคำที่ถูกต้อง90733เป็นคำที่ 6)

ลองออนไลน์!

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

แร็กเก็ต 106 ไบต์

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

การทดสอบ:

(f)

การส่งออกของรุ่น golfed:

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

เอาต์พุตของเวอร์ชันที่ไม่ได้ปรับแต่ง:

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

(ข้อผิดพลาดหลังจากนี้ในเครื่องของฉัน)


รหัส golfed พิมพ์ออกมาด้านตรงข้ามมุมฉากของลำดับ รุ่นที่ไม่ได้แสดงจะแสดงทั้งสามอย่างเพื่อชี้แจงสามสิ่งที่ไม่ได้กล่าวถึงในคำถาม
rnso


1

PHP, 139 ไบต์

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

ตัวแบ่งรหัสข้างต้นหลังจาก 28455997 บนระบบ 32 บิต หากต้องการจำนวนที่สูงกว่ามันจะกลายเป็น 156 ไบต์:

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 Bytes

-25 ไบต์ขอบคุณไมล์ใช้ n * n แทน Math.pow (n, 2)

-24 ไบต์ขอบคุณไมล์ใช้สำหรับลูปแทนในขณะที่เปลี่ยนประเภทข้อมูลกำจัด () เนื่องจากคำสั่งของการดำเนินงาน

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

ใช้ความจริงที่ว่า

ความสัมพันธ์

สำหรับคู่ของจำนวนเต็ม m> n> 0 ดังนั้น C เท่ากับ A บวก 2 (N) 2 2ฟังก์ชั่นด้านบนค้นหาค่าน้อยที่สุดของ N ที่สอดคล้องกับความสัมพันธ์นี้ในขณะที่ทำให้องค์ประกอบที่สองของพีทาโกรัสมีค่าเป็นสามเท่าและมากกว่าองค์ประกอบแรก จากนั้นจะกำหนดค่าขององค์ประกอบแรกเป็นองค์ประกอบที่สามและทำซ้ำกับองค์ประกอบแรกที่มีการปรับปรุง

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 ไม่ได้พิมพ์องค์ประกอบที่ต้องการครั้งสุดท้ายเนื่องจากการ จำกัด เวลาอย่างไรก็ตามในขณะที่คุณสามารถดูผ่านตรรกะของโปรแกรมและรุ่น ungolfed (ซึ่งพิมพ์ 28455997 เป็นองค์ประกอบที่สามของ Pythagorean ก่อนหน้ามากกว่าองค์ประกอบแรกของ ถัดไป) ค่าต่างๆจะถูกพิมพ์ด้วยการ จำกัด เวลาที่สูงขึ้น


คุณไม่สามารถใช้n*nแทนได้Math.pow(n,2)หรือ
ไมล์

ฉันไม่รู้ว่าทำไมฉันไม่คิดอย่างนั้น ... ฉันจะเพิ่มมันทันที ขอบคุณ @miles
Mario Ishac

ฉันโกนหนวดออกไปโดยใช้forลูปเพื่อลดขนาดให้เหลือ 133 ไบท์()->{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;}};
ไมล์

1

Python 3.5, 97 ไบต์

เอาต์พุตผิดหลังจาก28455997นั้นเนื่องจากข้อ จำกัด ของชนิดข้อมูลจุดลอย sqrtฟังก์ชั่นไม่ดีพอ แต่ถ้ามีความแม่นยำเพิ่มขึ้นอย่างน่าอัศจรรย์ก็ต้องการทำงาน

ค่อนข้างง่ายที่จะเข้าใจ การเพิ่มขึ้นทีcละสองตัวแทนที่จะเป็นการตัดรันไทม์ลงครึ่งหนึ่งและต้องตรวจสอบตัวเลขคี่เท่านั้นเนื่องจากองค์ประกอบนั้นจะเป็นเลขคี่เสมอ

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

ลองออนไลน์

โปรแกรมไม่สามารถรันบน Ideone ได้เนื่องจาก Ideone ใช้ Python 3.4


เพื่อผลลัพธ์ที่จะคงความแม่นยำได้นานขึ้นฉันต้องใช้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

ลองออนไลน์

เพื่อคงความแม่นยำไปเรื่อย ๆ ฉันสามารถทำสิ่งที่น่ากลัวเช่นนี้ (เพิ่มความแม่นยำที่ต้องใช้ซ้ำทุกครั้ง :

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 ตัวอักษร 338 ไบต์

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}

ทดสอบ ok จนกระทั่ง 14 เป็นอาร์กิวเมนต์ของ q:

  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
  ∧

ด้านล่างนี้จะพบกับตัวหารทั้งหมดของอาร์กิวเมนต์ ...

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.