Pisano period: Difference between revisions
Content added Content deleted
m (→{{header|Sidef}}: minor code simplification) |
Thundergnat (talk | contribs) (→{{header|Perl 6}}: Add a Perl 6 example) |
||
Line 416: | Line 416: | ||
4.208398 seconds (4.23 k allocations: 249.266 KiB) |
4.208398 seconds (4.23 k allocations: 249.266 KiB) |
||
</pre> |
</pre> |
||
=={{header|Perl 6}}== |
|||
{{works with|Rakudo|2020.02}} |
|||
Didn't bother making two differently named routines, just made a multi that will auto dispatch to the correct candidate. |
|||
<lang perl6>use Prime::Factor; |
|||
constant @fib := 1,1,*+*…*; |
|||
multi pisano-period (Int $p where *.is-prime, Int $k where * > 0 = 1) { |
|||
my $fibmod = @fib.map( * % $p**$k ); |
|||
(1..*).first: { !$fibmod[$_-1] and ($fibmod[$_] == 1) } |
|||
} |
|||
multi pisano-period (Int $p, Int $k where * > 0 = 1) { |
|||
[lcm] prime-factors($p).map: { samewith $_ } |
|||
} |
|||
put "Pisano period (p, 2) for primes less than 50"; |
|||
put (map { pisano-period($_, 2) }, ^50 .grep: *.is-prime )».fmt('%4d'); |
|||
put "\nPisano period (p, 1) for primes less than 180"; |
|||
.put for (map { pisano-period($_, 1) }, ^180 .grep: *.is-prime )».fmt('%4d').batch(15); |
|||
put "\nPisano period (p, 1) for integers 2 to 180"; |
|||
.put for (2..180).map( { pisano-period($_) } )».fmt('%4d').batch(15);</lang> |
|||
{{out}} |
|||
<pre>Pisano period (p, 2) for primes less than 50 |
|||
6 24 100 112 110 364 612 342 1104 406 930 2812 1640 3784 1504 |
|||
Pisano period (p, 1) for primes less than 180 |
|||
3 8 20 16 10 28 36 18 48 14 30 76 40 88 32 |
|||
108 58 60 136 70 148 78 168 44 196 50 208 72 108 76 |
|||
256 130 276 46 148 50 316 328 336 348 178 |
|||
Pisano period (p, 1) for integers 2 to 180 |
|||
3 8 3 20 24 16 3 8 60 10 24 28 48 40 3 |
|||
36 24 18 60 16 30 48 24 20 84 8 48 14 120 30 |
|||
3 40 36 80 24 76 18 56 60 40 48 88 30 40 48 |
|||
32 24 16 60 72 84 108 24 20 48 72 42 58 120 60 |
|||
30 16 3 140 120 136 36 48 240 70 24 148 228 40 18 |
|||
80 168 78 60 8 120 168 48 180 264 56 30 44 120 112 |
|||
48 120 96 180 24 196 48 40 60 50 72 208 84 80 108 |
|||
72 24 108 60 152 48 76 72 240 42 56 174 144 120 10 |
|||
60 40 30 20 48 256 3 88 420 130 120 144 408 40 36 |
|||
276 48 46 240 32 210 140 24 140 444 16 228 148 120 50 |
|||
18 72 240 60 168 316 78 216 60 48 24 328 120 40 168 |
|||
336 48 28 180 72 264 348 168 80 30 232 132 178 120</pre> |
|||
=={{header|Sidef}}== |
=={{header|Sidef}}== |