#!/usr/bin/ruby
#
#
func is_even_perfect(n) {
var v = valuation(n, 2) || return false
var m = (n >> v)
(m & (m+1)).is_zero || return false
(m >> v ).is_one || return false
is_mersenne_prime(v+1)
}
var i = 0;
DATA.each { |line|
var n = line.numbers[-1]
is_even_perfect(n) || die "false negative: #{n}"
var r = i.irand(n-1)
is_even_perfect(r) && die "false positive: #{r}"
i = n+1
}
var p = []
for n in (-10 .. 500) {
if (is_even_perfect(n)) {
p << n
}
}
assert_eq(p, [6, 28, 496])
say "** Test passed!"
__DATA__
1 6
2 28
3 496
4 8128
5 33550336
6 8589869056
7 137438691328
8 2305843008139952128
9 2658455991569831744654692615953842176
10 191561942608236107294793378084303638130997321548169216
11 13164036458569648337239753460458722910223472318386943117783728128
12 14474011154664524427946373126085988481573677491474835889066354349131199152128
13 23562723457267347065789548996709904988477547858392600710143027597506337283178622239730365539602600561360255566462503270175052892578043215543382498428777152427010394496918664028644534128033831439790236838624033171435922356643219703101720713163527487298747400647801939587165936401087419375649057918549492160555646976
14 141053783706712069063207958086063189881486743514715667838838675999954867742652380114104193329037690251561950568709829327164087724366370087116731268159313652487450652439805877296207297446723295166658228846926807786652870188920867879451478364569313922060370695064736073572378695176473055266826253284886383715072974324463835300053138429460296575143368065570759537328128