blob: c3ce9f0b1aef0605d7a55ba78bdf0188dcaed4d3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
CREATE SCHEMA IF NOT EXISTS pwc155;
/**
* Inspired by Abigail's solution and documentation:
https://github.com/manwar/perlweeklychallenge-club/pull/5751/commits/8c4b7ad7bd474c48af5bebdb566412d30101f28e
*/
/*
testdb=> select pwc155.pisano_period( 3 );
DEBUG: Fibonacci is 1,1
DEBUG: Fibonacci is 1,1,2
DEBUG: Fibonacci is 1,1,2,3
DEBUG: 3 found on index 4
pisano_period
---------------
8
*/
CREATE OR REPLACE FUNCTION
pwc155.pisano_period( int )
RETURNS integer
AS $CODE$
my @fibonacci;
for ( 1 .. 999999 ) {
push @fibonacci, 1 if $_ <= 1;
push @fibonacci, @fibonacci[ -1 ] + @fibonacci[ -2 ];
elog( DEBUG, "Fibonacci is " . join( ',', @fibonacci ) );
last if @fibonacci[ -1 ] == $_[0];
}
# get the index
my $index = $#fibonacci + 1;
elog( DEBUG, "$_[0] found on index $index");
return $index * 2 if $_[0] >= 3 and $index % 2 == 0;
return $index * 4 if $_[0] >= 5 and $index % 2 == 1;
$CODE$
LANGUAGE plperl;
|