Skip to main content

RERF_HARD

Static RERF_HARD 

Source
pub(crate) static RERF_HARD: [[(u64, u64); 11]; 96]
Expand description

Poly for x/erf(x) generated by Sollya and SageMath:

def build_sollya_script(idx):
    return f"""
d = [{idx}/16, {idx + 1}/16];

f = x/erf(x);
Q = fpminimax(f, [|0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20|], [|107...|], d);

for i from 0 to degree(Q) by 2 do {{
    write(coeff(Q, i)) >> "coefficients.txt";
    write("\\n") >> "coefficients.txt";
}};
"""

def load_coefficients(filename):
    with open(filename, "r") as f:
        return [RealField(500)(line.strip()) for line in f if line.strip()]

def call_sollya_on_interval(idx):
    sollya_script = build_sollya_script(idx)
    with open("tmp_interval.sollya", "w") as f:
        f.write(sollya_script)
    import subprocess
    if os.path.exists("coefficients.txt"):
        os.remove("coefficients.txt")
    try:
        result = subprocess.run(
            ["sollya", "tmp_interval.sollya"],
            check=True,
            capture_output=True,
            text=True
        )
    except subprocess.CalledProcessError as e:
        return

def print_coeffs(poly):
    print("[")
    for i in range(len(poly)):
        coeff = poly[i]
        print_double_double("", coeff)
    print("],")

print(f"pub(crate) static RERF_HARD: [[(u64, u64); 11]; 96] = [")
for i in range(0, 96):
    call_sollya_on_interval(i)
    coeffs = load_coefficients(f"coefficients.txt")
    print_coeffs(coeffs)
print("];")