Wiki
Research notes on every problem, and a library of the papers behind them. Built from the open erdos repository.
erdos_699_bft_asymmetric_pair_table.py
py
"""Verify a larger table of asymmetric BFT cofactor constraints.
Published GCD parameters give numerical thresholds. Parameters using a
strict rational lower bound on log L(c/d) give effective thresholds via
BFT's proof of Theorem 2.2; this checker does not evaluate those thresholds.
No binomial rows are enumerated.
"""
from fractions import Fraction
import json
from pathlib import Path
from mpmath import iv
from erdos_699_bft_asymmetric import asymmetric_bound
from erdos_699_bft_pair_extension import log_l_bounds, rational
iv.dps = 80
PARAMETERS = Path(__file__).with_name("erdos_699_bft_asymmetric_pair_parameters.json")
PUBLISHED_GCD = {
(9, 8): ("1.1742", 25), (8, 7): ("1.1951", 28),
(7, 6): ("1.2219", 53), (6, 5): ("1.2581", 35),
(5, 4): ("1.3098", 50), (9, 7): ("1.3317", 15),
(7, 5): ("1.4135", 74), (4, 3): ("1.4170", 153),
(3, 2): ("1.5395", 138), (8, 5): ("1.5407", 53),
(5, 3): ("1.5454", 86), (3, 1): ("1.5498", 260),
(25, 17): ("1.5540", 582), (7, 4): ("1.6219", 60),
(8, 3): ("1.6560", 149), (9, 5): ("1.6636", 79),
(5, 2): ("1.7017", 231), (7, 3): ("1.7282", 161),
(9, 4): ("1.7666", 87), (2, 1): ("1.9377", 150),
}
def prime_base(power, pair):
assert power > 1
for prime in pair:
value = power
while value % prime == 0:
value //= prime
if value == 1:
return prime
raise AssertionError("seed is not a power of an indicated prime")
def endpoint_limits(seed, log_l1):
p_power, q_power, a, b, c, d = seed
delta = a*p_power - b*q_power
assert delta > 0 and c > d >= 1
s = rational(Fraction(c, d))
z = rational(Fraction(delta, a*p_power))
assert s < 1/z
root = iv.sqrt(s*s*z*z + 4 - 4*z)
u1 = 2*(s - 1) / (s*(2 - z) + root)
u2 = 2 / (s*z + 2 + root)
log_alpha = (s + 1)*iv.log(s + 1) - (s - 1)*iv.log(s - 1)
log_q = (log_alpha + (s - 1)*iv.log(u1)
+ iv.log(1 - u1) + iv.log(1 - u1 + z*u1))
log_e = (log_alpha + iv.log(u2) + iv.log(1 - u2)
+ (s - 1)*iv.log(1 - z*u2))
omega3 = ((s - 1)*iv.log(p_power) + log_l1 - iv.log(a)
- s*iv.log(b) - log_q)
omega4 = (s*iv.log(min(p_power, q_power)) + log_l1
- (s - 1)*iv.log(a*p_power) - 2*iv.log(delta) - log_e)
assert omega3 > 0 and omega4 > 0
k = iv.log(max(p_power, q_power)) + omega4/s
return 1 - iv.log(p_power)/k, 1 - iv.log(q_power)/k
def check_row(row, published):
seed = row["seed"]
p_power, q_power, _, _, c, d = seed
pair = row["pair"]
p_base, q_base = prime_base(p_power, pair), prime_base(q_power, pair)
assert p_base != q_base
targets = dict(zip(pair, map(lambda x: Fraction(x, 10000), row["endpoints_scaled"])))
assert all(0 < x < Fraction(1, 2) for x in targets.values())
if published:
assert (row["L1"], row["m0"]) == PUBLISHED_GCD[c, d]
log_l1 = iv.log(rational(row["L1"]))
else:
log_l1 = rational(row["log_L1"])
assert log_l1 < log_l_bounds(c, d)
limits = endpoint_limits(seed, log_l1)
assert limits[0] > rational(targets[p_base])
assert limits[1] > rational(targets[q_base])
result = {
**row,
"asymmetric_edge_scaled": pair + row["endpoints_scaled"],
"verified": True,
}
if published:
threshold = asymmetric_bound(*seed, log_l1, row["m0"], 100,
targets[p_base], targets[q_base])
result["numerical_threshold"] = threshold
else:
result["threshold_scope"] = "Effectively computable by BFT Section 7; not numerically evaluated."
return result
def main():
parameters = json.loads(PARAMETERS.read_text())
result = {
"source": parameters["source"],
"weight_denominator": parameters["weight_denominator"],
"published_gcd_pairs": [check_row(row, True)
for row in parameters["published_gcd_parameters"]],
"effective_gcd_pairs": [check_row(row, False)
for row in parameters["effective_gcd_parameters"]],
}
Path(__file__).with_suffix(".json").write_text(json.dumps(result, indent=2) + "\n")
for key in ("published_gcd_pairs", "effective_gcd_pairs"):
print(key, len(result[key]), "verified")
if __name__ == "__main__":
main()
Graph