def paf_invariant(A, B): assert len(A) == len(B), "len mismatch" N = len(A) for i in range(1, 1 + (N-1)//2): comp = 2 * (paf(A, i) + paf(B, i) - sum(A) - sum(B)) + N if comp != 1: return False return True
def check_paf_invariant(A, B): # only check half of sequence due to PAF symmetry Accounting.start_task('check_paf_invariant') v = len(A) for s in range(1, len(A)//2+1): Accounting.start_task('check_paf_invariant_step') paf_a = paf(A, s) paf_b = paf(B, s) if not paf_a + paf_b == 2: Accounting.finish_task('check_paf_invariant_step') Accounting.finish_task('check_paf_invariant') return False Accounting.finish_task('check_paf_invariant_step') Accounting.finish_task('check_paf_invariant') return True