Perfect numbers: Difference between revisions

Content added Content deleted
m (→‎{{header|AppleScript}}: updated primitives)
m (→‎Modules: simpler and more efficient code)
Line 1,823: Line 1,823:


In addition to generating even perfect numbers, we can also have a fast function which returns true when a given even number is perfect:
In addition to generating even perfect numbers, we can also have a fast function which returns true when a given even number is perfect:
<lang perl>use ntheory qw(is_mersenne_prime valuation hammingweight is_power sqrtint);
<lang perl>use ntheory qw(is_mersenne_prime valuation);


sub is_even_perfect {
sub is_even_perfect {
my ($n) = @_;
my ($n) = @_;
my $v = valuation($n, 2) || return;

$n % 2 == 0 || return;
my $m = ($n >> $v);
($m & ($m + 1)) && return;

my $square = 8 * $n + 1;
($m >> $v) == 1 || return;
is_mersenne_prime($v + 1);
is_power($square, 2) || return;

my $k = (sqrtint($square) + 1) / 2;
hammingweight($k) == 1 && is_mersenne_prime(valuation($k, 2));
}</lang>
}</lang>