पिसानो अवधि ज्ञात कीजिए


20

फाइबोनैचि अनुक्रम एक दृश्य अच्छी तरह से पता है, जिसमें प्रत्येक प्रविष्टि पिछले दो और पहले दो प्रविष्टियों का योग है कर रहे हैं 1. हम एक निरंतर अनुक्रम समय-समय पर हो जाएगा द्वारा प्रत्येक शब्द के सापेक्ष लेते हैं है। उदाहरण के लिए यदि हमने अनुक्रम mod 7 की गणना करने का निर्णय लिया तो हमें निम्नलिखित मिलेगा:

1 1 2 3 5 1 6 0 6 6 5 4 2 6 1 0 1 1 ...

इसकी अवधि 16 है। एक संबंधित अनुक्रम, जिसे पिसानो अनुक्रम कहा जाता है , को इस तरह परिभाषित किया गया है कि a(n)जब माड्यूलो एन की गणना की जाती है, तो यह दृश्य अनुक्रम की अवधि होती है।

कार्य

आपको एक प्रोग्राम या फ़ंक्शन लिखना चाहिए जो दिए nजाने पर फाइबोनैचि अनुक्रम मॉड की अवधि की गणना और आउटपुट करेगा n। पिस्सनो अनुक्रम में यह नौवां शब्द है।

आपको रेंज पर केवल पूर्णांकों का समर्थन करना चाहिए 0 < n < 2^30

यह एक प्रतियोगिता है, इसलिए आपको अपने स्रोत कोड के आकार को बाइट्स के अनुसार कम से कम करना चाहिए।

परीक्षण के मामलों

1  -> 1
2  -> 3
3  -> 8
4  -> 6
5  -> 20
6  -> 24
7  -> 16
8  -> 12
9  -> 24
10 -> 60
11 -> 10
12 -> 24

3
2 ^ 30 तक सीमा सुनिश्चित कर सकती है कि सभी मध्यवर्ती मान 2 ^ 31 से कम हैं, लेकिन यह अभी भी गारंटी नहीं देता है कि पिसानो अवधि एक 32-बिट हस्ताक्षरित पूर्णांक के भीतर फिट होगी। (मुझे लगता है कि आपकी सीमा का कारण है?) पिसानो पीरियड्स अपने n से काफी बड़ा हो सकता है । उदाहरण के लिए, 6 का पिसानो पीरियड 24 है। 100 में 10 से ऊपर की शक्तियां n से 50 प्रतिशत बड़ी हैं ।
इस्सी

3
कबूतर सिद्धांत कहता है कि f(i),f(i+1)अधिकांश n^2मूल्यों पर ले जा सकते हैं आधुनिक n। इस प्रकार, nसीमित 2^30अवधि तक उत्पादन कर सकता है 2^60। प्रतिबन्ध n <= 2^16देना होगा P(n) <= 2^32
बूथ

@boothby मुझे यकीन नहीं है कि मैं समझ रहा हूं कि आप क्या कह रहे हैं, या अगर यह ठीक से उसी समस्या को संबोधित कर रहा है जो मैं हूं। क्या आप थोड़ा और समझा सकते हैं, शायद अतिरिक्त लिंक के साथ? जरूरत पड़ने पर मुझे चैट में खींचने के लिए स्वतंत्र महसूस करें।
इस्स

2
@Iszi का निरीक्षण करें f(i+2) = f(i+1)+f(i), इसलिए अवधि से अधिक मशीन लूपिंग की 'स्थिति' को पूर्णांक मॉड की एक जोड़ी के साथ वर्णित किया जा सकता है n। अधिकांश n^2राज्यों में हैं, इसलिए अवधि सबसे अधिक है n^2। ओह! विकिपीडिया का दावा है कि यह अवधि सबसे अधिक है 6n। मेरी तुच्छता को कभी नहीं।
बूथबाई

जवाबों:


11

GolfScript ( 28 25 24 23 वर्ण)

~1.{(2$+}{.@+2$%}/+\-,)

स्टडिन में इनपुट लेता है, स्टैडआउट पर छोड़ देता है (या स्टैक, यदि आप इसे आगे प्रोसेस करना चाहते हैं ...)

यह कोने के मामलों ( डेमो ) को सही ढंग से संभालता है ।

GolfScript प्रोग्रामर के लिए रुचि के एक बिंदु के रूप में, मुझे लगता है कि यह पहला कार्यक्रम है जिसे मैंने एक अनकही के साथ लिखा है जो वास्तव में मेरे द्वारा किए गए अन्य दृष्टिकोणों की तुलना में छोटा था।


7

GolfScript, 24 अक्षर

~:&1.{.2$+&%.2$(|}do](-,

एक गोल्फस्क्रिप्ट कार्यान्वयन का अगला पुनरावृत्ति। दूसरा संस्करण भी अब 1 सही ढंग से संभालता है। यह काफी लंबा हो गया, लेकिन हो सकता है कि कोई व्यक्ति इस संस्करण को छोटा करने का तरीका खोज सके। आप ऑनलाइन संस्करण के ऊपर कोशिश कर सकते हैं ।


क्या यह इनपुट को 1सही तरीके से हैंडल करता है?
पीटर टेलर

@PeterTaylor नहींं, उस कोने के मामले का परीक्षण नहीं किया। ड्रॉइंग बोर्ड पर वापस।
हावर्ड

@PeterTaylor नया कोड इनपुट के लिए भी काम करता है 1- और अभी भी केवल 24 वर्ण।
हावर्ड

4

पायथन, 188 132 101 95 87 वर्ण

n=input()
s=[]
a=k=0
b=1
while s[:k]!=s[k:]or k<1:s+=[a%n];k=len(s)/2;a,b=b,a+b
print k

प्रयोग

$ echo 10 | python pisano.py
60

उदाहरण के लिए:

$ for i in {1..50}; do; echo $i | python pisano.py; done
1
3
8
6
20
24
16
12
24
60
10
24
28
48
40
24
36
24
18
60
16
30
48
24
100
84
72
48
14
120
30
48
40
36
80
24
76
18
56
60
40
48
88
30
120
48
32
24
112
300

धन्यवाद, beary605 , अतिरिक्त गोल्फ के लिए!
ESultanik

आप अपने वर्णों को फिर से गिनना चाह सकते हैं। आपकी प्रतिक्रिया की मेरी गिनती आपकी प्रतिक्रिया की गिनती से नीचे है
डेविड

@ डेविड: क्या आप व्हॉट्सएप की गिनती कर रहे हैं? मैं सिर्फ डबल-चेक किया ( catटिंग टू wc -cऔर मुझे एक ही नंबर मिलता है।
ESultanik

मैं वुल्फ्राम रिसर्च द्वारा सुसज्जित एक रूटीन का उपयोग करता हूं। मुझे लगता है कि यह आवश्यक सफेद स्थान है।
डेविड

if k>0 and s[0:k]==s[k:]:breakको बदला जा सकता है if s and s[:k]==s[k:]:break। आप इट्रेटर को हटाकर, forलूप को बदलकर while 1:, और लूप a,b=a,a+bके अंत में प्रदर्शन करके भी काफी कटौती कर सकते हैं ।
स्ट्राइगोइड्स

4

अजगर 90 85 96 94 90 82

n=input();c=[1,1];a=[]
while(c in a)<1%n:a+=[c];c=[c[1],sum(c)%n]
print len(a)or 1

संपादित करें: भालू और प्राइमो द्वारा कार्यान्वित सुझाव


85:, a.append(c) -> a+=[c]जबकि लूप को एक ही लाइन पर रखा जा सकता है,((n>1)>>(c in a)) -> (n>1)>>(c in a)
beary605

appendवास्तव में की तुलना में एक अलग कार्यक्षमता है +=। सुझाव के लिए धन्यवाद, हालांकि।
स्केलेवर

मुझे लगता है कि यह इस मामले में उसी तरह काम करता है।
beary605

(n>1)>>(c in a) -> (c in a)<1%n3 बाइट्स के लिए। और मैं परिशिष्ट के बारे में भालू से सहमत हूं। चाहे आप किसी संदर्भ को जोड़ते हैं c, या aके मान से विस्तार करते हैं c, यह बिल्कुल उसी तरह से है (जैसा कि आप तुरंत किसी भी तरह अपने संदर्भ को नष्ट कर देते हैं c)।
प्रिमो

आह ठीक है, मेरी गलती है कि मैं का उपयोग कर रहा था a+=cके बजायa+=[c]
scleaver

2

गणितज्ञ 73

p = {1, 0}; j = 0; q = p;
While[j++; s = Mod[Plus @@ p, n]; p = RotateLeft@p; p[[2]] = s; p != q]; j

2

PHP - 61 57 बाइट्स

<?for(;1<$a.$b=+$a+$a=!$i+++$b%$n+=fgets(STDIN););echo$i;

यह स्क्रिप्ट ग़लती से रिपोर्ट करेंगे 2के लिए n=1है, लेकिन अन्य सभी मान सही हैं।

नमूना I / O, एक छोड़ी जाने वाली श्रृंखला जहां n (n) = 2n + 2:

$ echo 3 | php pisano.php
8
$ echo 13 | php pisano.php
28
$ echo 313 | php pisano.php
628
$ echo 3313 | php pisano.php
6628
$ echo 43313 | php pisano.php
86628
$ echo 543313 | php pisano.php
1086628
$ echo 4543313 | php pisano.php
9086628
$ echo 24543313 | php pisano.php
49086628

1
1<$a.$b=+$a+$a=!$i+++$b%$n+=fgets(STDIN)हे भगवान, यह ऑपरेशन शोषण का कुछ क्रम है।
श्री लामा

1

पॉवरशेल: 98

गोल्फ कोड:

for($a,$b=0,(1%($n=read-host))){$x++;if($a+$b-eq0-or("$a$b"-eq10)){$x;break}$a,$b=$b,(($a+$b)%$n)}

टिप्पणियों के साथ असंगठित:

for
(
    # Start with $a as zero, and $b as 1%$n.
    # Setting $b like this at the start helps catch the exceptional case where $n=1.
    $a,$b=0,(1%
    (
        # Grab user input for n.
        $n=read-host
    ))
)
{
    # Increasing the counter ($x) and testing for the end of the period at the start ensures proper output for $n=1.
    $x++;

    # Test to see if we've found the end of the Pisano Period.
    if
    (
        # The first part catches $n=1, since $a and $b will both be zero at this point.
        $a+$b-eq0-or
        (
            # A shorter way of testing $a-eq1-and$b-eq0, which is the end of a "normal" Pisano Period.
            "$a$b"-eq10
        )
    )
    {
        # Pisano Period has reached its end. Output $x and get out of the loop.
        $x;break
    }

    # Pisano Period still continues, perform operation to calculate next number.
    # Works pretty much like a Fibonacci sequence, but uses ($a+$b)%$n for the new $b instead.
    # This takes advantage of the fact we don't really need to track the actual Fibonacci numbers, just the Fibonacci pattern of %$n.
    $a,$b=$b,(($a+$b)%$n)
}

# Variable cleanup - not included in golfed code.
rv n,a,b,x

टिप्पणियाँ:

मुझे यकीन नहीं है कि इस स्क्रिप्ट के साथ $ n के लिए अधिकतम विश्वसनीय सीमा क्या है। यह संभवतः 2 ^ 30 से कम है, क्योंकि $ x संभवत: $ n होने से पहले एक इंट 32 को ओवरफ्लो कर सकता है। इसके अलावा, मैंने खुद को ऊपरी सीमा का परीक्षण नहीं किया है क्योंकि स्क्रिप्ट के लिए समय पहले से ही $ n = 1e7 (जो कि केवल 2 ^ 23 से थोड़ा अधिक है) के लिए मेरे सिस्टम पर लगभग 30 सेकंड मारा गया है। इसी कारण से, मैं इस स्क्रिप्ट की श्रेणी का विस्तार करने के लिए जहां आवश्यकता होती है, अतिरिक्त रूप से uint32, int64 या uint64 में चर को अपग्रेड करने के लिए जो भी अतिरिक्त सिंटैक्स की आवश्यकता होती है, उसका परीक्षण और निवारण करने के लिए इच्छुक नहीं हूं।


नमूना उत्पादन:

मैंने इसे लूप के लिए दूसरे में लपेटा:

for($i=1;;$i++)

इसके $n=$iबजाय सेट करें =read-host, और "$i | $x"स्क्रिप्ट की सामान्य विश्वसनीयता का विचार प्राप्त करने के लिए आउटपुट को बदल दिया । यहाँ कुछ उत्पादन है:

1 | 1
2 | 3
3 | 8
4 | 6
5 | 20
6 | 24
7 | 16
8 | 12
9 | 24
10 | 60
11 | 10
12 | 24
13 | 28
14 | 48
15 | 40
16 | 24
17 | 36
18 | 24
19 | 18
20 | 60

...

9990 | 6840
9991 | 10192
9992 | 624
9993 | 4440
9994 | 1584
9995 | 6660
9996 | 1008
9997 | 1344
9998 | 4998
9999 | 600
10000 | 15000
10001 | 10212
10002 | 3336
10003 | 5712
10004 | 120
10005 | 1680
10006 | 10008
10007 | 20016
10008 | 552
10009 | 3336
10010 | 1680

सिडेनोट: मुझे वास्तव में यकीन नहीं है कि कैसे कुछ पिसानो पीरियड्स $ n से काफी कम हैं। क्या यह सामान्य है, या मेरी स्क्रिप्ट में कुछ गड़बड़ है? नेवरमाइंड - मुझे सिर्फ इतना याद है कि, 5 के बाद, फाइबोनैचि संख्या जल्दी से अनुक्रम में अपनी जगह से बहुत बड़ी हो जाती है। तो, यह अब कुल मतलब है।


1

पर्ल, 75 , 61 , 62 + 1 = 63

$k=1%$_;$a++,($m,$k)=($k,($m+$k)%$_)until$h{"$m,$k"}++;say$a-1

प्रयोग

$ echo 8 | perl -n -M5.010 ./pisano.pl
12

Ungolfed

$k = 1 % $_;
$a++, ($m, $k) = ($k, ($m + $k) % $_) until $h{"$m,$k"}++;
say $a - 1

-nझंडे के लिए +1 बाइट । गेब्रियल बेनामी की बदौलत 13 बाइट्स निकाल दिए।


1
आप $n=<>;(-6) से छुटकारा पा सकते हैं और इसे -nध्वज (+1) $nसे बदल सकते हैं , फिर सभी उदाहरणों को प्रतिस्थापित किया जा सकता है $_। आप -M5.010मुफ्त में उपयोग कर सकते हैं, जो आपको (-2) के sayबजाय कमांड का उपयोग करने देता है print। संशोधक whileकथनों को शर्त (-2) के आसपास कोष्ठक की आवश्यकता नहीं है। इसके बजाय @{[%h]}/2, आपके पास $a++,पहले एक काउंटर हो सकता है ($m,$k)=और फिर बस say$a-1अंत में (-2) हो सकता है। "$m,$k"उपयोग के बजाय $m.$k(-2)। यह ध्वज के $k=1%$_;$a++,($m,$k)=($k,($m+$k)%$_)while!$h{$m.$k}++;say$a-1साथ -n61 + 1 = 62 बाइट्स के लिए बाहर आना चाहिए ।
गैब्रियल बेनामी

स्पष्ट रूप से मैं पर्ल के साथ उतना चालाक नहीं हूं जितना मैंने सोचा था कि मैं था। सुझावों के लिए धन्यवाद।
सिल्वियो मायोलो

पर्ल थ्रेड में गोल्फ के लिए टिप्स में बहुत सारे उपयोगी संकेत हैं ! सौभाग्य! ^ ^
गेब्रियल बेनामी

दरअसल, मैं गलत था - (+2) के "$m,$k"बजाय आपको जरूरत है $m.$k, लेकिन (-1) while!$hको बदलकर आप 1 बाइट बचा सकते हैं until$h। माफ़ करना!
गेब्रियल बेनामी

हम्म? किस इनपुट के तहत $m.$kविफल? यह मेरे अंत पर काम करने लगा।
सिल्वियो मायोलो

0

क्लोजर, 102 बाइट्स

बहुत रोमांचक नहीं है, सूत्र तक iterates जब तक हम वापस नहीं पहुँचे [1 1] (मुझे आशा है कि यह हमेशा मामला है)। (f 1)इसे संभालते ही विशेष हैंडलिंग [0 0]

#(if(< % 2)1(+(count(take-while(fn[v](not=[1 1]v))(rest(iterate(fn[[a b]][b(mod(+ a b)%)])[1 1]))))1))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.