http://qs321.pair.com?node_id=989681


in reply to Zeckendorf representation

sub is_fibonnacci { my $plus = (5 * $_[0] * $_[0]) + 4; my $mins = (5 * $_[0] * $_[0]) - 4; return is_perfect_square($plus) | is_perfect_square($mins); }

No need to calculate 5 * $_[0] * $_[0] twice, and you probably meant to use the logical or operator instead of the bit-wise or operator.

sub is_fibonnacci { my $plus = (5 * $_[0] * $_[0]) + 4; my $mins = $plus - 8; return is_perfect_square($plus) || is_perfect_square($mins); }

(The logical operators short-circuit so is_perfect_square($mins) will only execute if is_perfect_square($plus) is true.)



sub is_perfect_square { my $sqrt = int(sqrt($_[0])); return $sqrt * $sqrt == $_[0]; }

Or just:

sub is_perfect_square { int( $_[0] ** .5 ) ** 2 == $_[0] }