#!/usr/bin/ruby # ## https://en.wikipedia.org/wiki/Perfect_number # 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