पायथागॉरियन ट्रिपल सीक्वेंस


33

एक पायथागॉरियन ट्रिपल में तीन सकारात्मक पूर्णांक होते हैं a, b, और c, जैसे कि 2 + b 2 = c 2 । ऐसा ट्रिपल आमतौर पर लिखा जाता है (ए, बी, सी), और एक प्रसिद्ध उदाहरण है (3, 4, 5)। यदि (ए, बी, सी) पाइथागोरस ट्रिपल है, तो किसी भी सकारात्मक पूर्णांक के लिए ऐसा (का, केबी, केसी) है। एक आदिम पायथागॉरियन ट्रिपल वह है जिसमें ए, बी और सी कोप्राइम हैं

इस ज्ञान का उपयोग करते हुए, हम त्रिभुजों की कम से कम लंबाई को एक साथ जोड़कर एक अनुक्रम बना सकते हैं, जहां अनुक्रम में अगला तत्व सबसे छोटे आदिम पायथागॉरियन ट्रिपल का कर्ण (सबसे बड़ी संख्या) है, जिसमें पिछले तत्व की लंबाई सबसे छोटी है।

सबसे छोटे आदिम पायथागॉरियन ट्रिपल (3, 4, 5) के साथ शुरू करें। अनुक्रम के साथ शुरू होता है 3, और कर्ण (अनुक्रम में अगला तत्व) है 5। फिर 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

इसी तरह के अनुक्रम (इन का उत्पादन न करें!):


क्या कोई समय सीमा है?
लवजो

@Lovjo नहीं, लेकिन आपको पता होना चाहिए / साबित होना चाहिए कि आपका आउटपुट सही है। कुछ ऐसे ही सीक्वेंस हैं जहां आउटपुट के बाद अलग है 12325
mbomb007

इसी तरह के अनुक्रम के बारे में मैं सोच रहा हूँ कि 85इसके बाद ... इसका अगला कार्यकाल है 3613(क्या आप अनुमान लगा सकते हैं कि यह अभी तक क्या है?)
नील

@ नील एक त्वरित खोज A053630 , पाइथोगोरियन सर्पिल की पैदावार । मैंने हालांकि चुनौती में दोनों का उल्लेख किया, क्योंकि मेरे कार्यान्वयन पर काम करते समय मैं गलती से उन दो अनुक्रमों या उनके समान पहुंच गया।
mbomb007

1
वास्तव में, क्या मैं अधिक जाग गया था मैं सिर्फ इसे खुद को देख सकता था ...
नील

जवाबों:


11

जेली , 19 बाइट्स

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

अनंत अनुक्रम को दर्शाते हुए @ डेनिस को बाइट धन्यवाद दिया ।

कोई इनपुट और तर्क नहीं देता है, फिर प्रत्येक शब्द को मुद्रित करके अनुक्रम को अनन्त रूप से आउटपुट करता है क्योंकि यह उनकी गणना करता है। यह विधि धीमी हो जाती है क्योंकि संख्याएं बड़ी हो जाती हैं क्योंकि यह मुख्य कारक पर निर्भर करता है।

इसे ऑनलाइन आज़माएं!

यह वर्तमान पद के प्रमुख शक्ति कारक की गणना करके अगले पद की गणना करता है। 12325 के लिए, यह {5 2 , 17, 29} है। पाइथोगोरियन त्रिगुणों की गणना के लिए यूक्लिड के सूत्र का एक प्रकार है { a , b , c },

सूत्र

जहाँ m > n और ट्रिपल आदिम iff m और n हैं, जो प्रतिरूप हैं।

12325 से अगली आदिम जड़ की गणना करने के लिए, m और n को खोजें, जैसे mn = 12325 और m , n को चुनें ताकि gcd ( m , n ) = 1. फिर m के सभी जोड़े उत्पन्न करें , n {5 2 के सभी सबसेट बनाकर , १,, २ ९} और उनमें से प्रत्येक उपसमूह के उत्पाद का पता लगाना जो {१, २५, १ and, २ ९, ४२५, ,२५, ४ ९ ३, १२३२५} हैं। फिर प्रत्येक मान और जोड़ी द्वारा 12325 को विभाजित करें ताकि प्रत्येक जोड़ी m , n हो । प्रत्येक जोड़ी का उपयोग करके c के लिए सूत्र की गणना करें और न्यूनतम ले जो 90733 है।

  • 22803497032152547474747848484847568309873567462040557371704906615255739053990978524464949205205 ​​के बाद अगले पद को निर्धारित करने के लिए पिछला तरीका विफल रहा। पिछली विधि ने एक कारक के रूप में अंतिम विकल्प को चुना जब सही विकल्प 3 था और अंतिम अपराध। नई विधि धीमी है, लेकिन हमेशा काम करेगी क्योंकि यह न्यूनतम कर्ण को खोजने के लिए सभी जोड़ियों के परीक्षण करती है।

व्याख्या

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

ब्रेकीलॉग , 36 बाइट्स

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

इसे ऑनलाइन आज़माएं!

TIO आउटपुट को फ्लश करने से पहले आपको प्रोग्राम के आउट होने (1 मिनट) तक इंतजार करना होगा। SWI-Prolog की 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

पर्ल, 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साथ विभाज्य होने के साथ मैथुन किया जाता है, तो a,b,cएक आदिम ट्रिपल होता है, जहां a,b,cसभी जोड़ीदार कोप्राइम होते हैं।

इसे ध्यान में रखते हुए, कुछ को देखते हुए a, मैं सबसे छोटे वर्ग की गणना करने के लिए एक ब्रूट-फोर्स एल्गोरिथ्म का उपयोग करता हूं, nजो कि a²-n²एक वर्ग है, अर्थात् । फिर, cके बराबर है n²+m²


आपके स्पष्टीकरण में संभावित टाइपो: आप nऐसे खोजते हैं जो a+n²एक वर्ग है।
नील

2

पायथन 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 से अधिक संख्या के लिए आज़माएं नहीं, यह बहुत धीमा होगा)


आप पायथन 3.5 पर स्विच कर सकते हैं और उपयोग कर सकते हैं math.gcd। इसके अलावा, का उपयोग p+=[...]करने के बजाय p.append(...)। और के <2बजाय ==1। और ifसभी एक लाइन पर हो सकते हैं।
mbomb007

1
मेरे द्वारा सुझाए गए अंतिम 2 सुधार आप अभी भी कर सकते हैं।
mbomb007


Loovjo, आप सुझावों का उपयोग करते हुए अपने कोड को गोल्फ करने जा रहे हैं या नहीं?
mbomb007

2

MATL , 27 बाइट्स

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

यह अनुक्रम की पहली शर्तों का उत्पादन करता है। इनपुट 0-आधारित है।

कोड बहुत अक्षम है। से अधिक इनपुट के लिए ऑनलाइन संकलक समय 5। इनपुट 6ने एक मिनट और आधा ऑफ़लाइन लिया (और 907336-वें शब्द के रूप में सही उत्पादन किया )।

इसे ऑनलाइन आज़माएं!

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)

गोल्फ संस्करण का उत्पादन:

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

(इसके बाद मेरी मशीन पर त्रुटि)


गोल्फ कोड केवल अनुक्रम के कर्ण को प्रिंट करता है। Ungolfed संस्करण सभी तीनों को स्पष्ट करने के लिए दिखाता है कि प्रश्न में उल्लेख नहीं किया गया है।
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++);

32-बिट सिस्टम पर 28455997 के बाद उपरोक्त कोड टूट जाता है। यदि उच्च संख्या की आवश्यकता है, तो यह 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

जावा 8, 133 बाइट्स

-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 के बराबर है । उपरोक्त फ़ंक्शन एन का कम से कम मूल्य पाता है जो इस संबंध को संतुष्ट करता है, जबकि पायथागॉरियन के दूसरे तत्व को एक पूर्णांक ट्रिपल बनाता है और पहले तत्व से अधिक है। फिर यह पहले तत्व के मूल्य को तीसरे तत्व पर सेट करता है और अद्यतन पहले तत्व के साथ दोहराता है।

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 यह!

* समय सीमा के कारण आइडोन अंतिम आवश्यक तत्व को प्रिंट नहीं करता है, हालांकि जैसा कि आप कार्यक्रम के तर्क और अनगुल्ड संस्करण के माध्यम से देख सकते हैं (जो 28455997 को पिछले पाइथागोरस ट्रिपल के तीसरे तत्व के पहले तत्व के बजाय प्रिंट करता है। अगले), मान एक उच्च समय सीमा के साथ, मुद्रित होते हैं।


आप उपयोग नहीं कर सके n*n इसके बजायMath.pow(n,2) ?
मील

मुझे नहीं पता कि मैंने ऐसा क्यों नहीं सोचा ... मैं इसे तुरंत जोड़ दूंगा। @ मील्स
मारियो इशाक

मैंने कुछ और इस्तेमाल किया 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

पायथन 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

एपीएल (एनएआरएस), 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}

14 तक परीक्षण करें क्यू के तर्क के रूप में:

  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}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.