36 lines
708 B
Perl
36 lines
708 B
Perl
use strict;
|
|
use warnings;
|
|
|
|
sub stern_brocot {
|
|
my @list = (1, 1);
|
|
sub {
|
|
push @list, $list[0] + $list[1], $list[1];
|
|
shift @list;
|
|
}
|
|
}
|
|
|
|
{
|
|
my $generator = stern_brocot;
|
|
print join ' ', map &$generator, 1 .. 15;
|
|
print "\n";
|
|
}
|
|
|
|
for (1 .. 10, 100) {
|
|
my $index = 1;
|
|
my $generator = stern_brocot;
|
|
$index++ until $generator->() == $_;
|
|
print "first occurrence of $_ is at index $index\n";
|
|
}
|
|
|
|
{
|
|
sub gcd {
|
|
my ($u, $v) = @_;
|
|
$v ? gcd($v, $u % $v) : abs($u);
|
|
}
|
|
my $generator = stern_brocot;
|
|
my ($a, $b) = ($generator->(), $generator->());
|
|
for (1 .. 1000) {
|
|
die "unexpected GCD for $a and $b" unless gcd($a, $b) == 1;
|
|
($a, $b) = ($b, $generator->());
|
|
}
|
|
}
|