%M = ( A, sub { return $_[0] ** 2 - 22 * $_[0] + 85 }, B, sub { return $_[0] ** 2 + 9 * $_[0] + 20 }, C, sub { return $_[0] ** 2 - 16 * $_[0] - 36 }, D, sub { return $_[0] ** 3 - 15 * $_[0] ** 2 - 400 * $_[0] - 1500 }, E, sub { return $_[0] ** 3 - 43 * $_[0] ** 2 + 590 * $_[0] - 2600 }, F, sub { return $_[0] ** 2 - 19 * $_[0] - 150 }, G, sub { return $_[0] ** 3 - 98 * $_[0] ** 2 - 199 * $_[0] - 100 }, H, sub { return $_[0] ** 2 - 25 * $_[0] + 144 }, I, sub { return $_[0] ** 2 + 47 * $_[0] - 190 }, J, sub { return $_[0] ** 2 + 22 * $_[0] - 23 }, K, sub { return $_[0] ** 2 + 23 * $_[0] - 798 }, L, sub { return $_[0] ** 2 - 13 * $_[0] - 30 }, M, sub { return $_[0] ** 2 + 37 * $_[0] - 190 }, N, sub { return $_[0] ** 2 - 1 * $_[0] - 30 }, O, sub { return $_[0] ** 2 - 4 * $_[0] - 21 }, P, sub { return $_[0] ** 2 - 11 * $_[0] - 12 }, Q, sub { return $_[0] ** 3 - 12 * $_[0] ** 2 + 379 * $_[0] - 5156 }, R, sub { return $_[0] ** 3 - 46 * $_[0] ** 2 + 679 * $_[0] - 3234 }, S, sub { return $_[0] ** 2 + 44 * $_[0] - 141 }, T, sub { return $_[0] ** 2 - 12 * $_[0] + 32 }, U, sub { return $_[0] ** 2 + 9 * $_[0] - 22 }, V, sub { return $_[0] ** 2 + 14 * $_[0] + 33 }, W, sub { return $_[0] ** 2 + 37 * $_[0] - 12 }, X, sub { return $_[0] ** 3 + 11 * $_[0] ** 2 + 135 * $_[0] - 142 }, Y, sub { return $_[0] ** 2 - 59 * $_[0] - 14 }, Z, sub { return $_[0] ** 2 + 20 * $_[0] + 64 } ); $DELTA = 0.045; $RANGE_LO = 0; $RANGE_HI = 100; sub binsearch { my($key, $lo, $hi) = @_; my($mid) = $lo + ($RANGE_HI - $hi) / $RANGE_HI; ++$mid; if ($lo/$mid + $DELTA <= 1.0) { if (&{$M{$key}}($mid) > 0) { return binsearch($key, $mid, $hi); } elsif (&{$M{$key}}($mid) < 0) { return binsearch($key, $lo + 1, $hi); } else { $RESULT[$mid] = ($mid**2 - 13*$mid + 12 ? lc $key : $key); $RESULT[$mid] .= ' ' if !($mid**3 - 30*$mid**2 + 269*$mid - 660); return binsearch($key, $mid, $hi); } } else { return 0; } } foreach (keys %M) { # find roots of each equation in range binsearch($_, $RANGE_LO, $RANGE_HI); } print @RESULT; print ",\n"; # for canonical JAPH form