// Implement WorstCase functions to compute the worst case for x mod C, with
// the exponent of x ranges from emin to emax, and precision of x is p.
// Adapted to Sollya from the Maple function in 
//   J-M. Muller, "Elementary Functions", 3rd ed, Section 11.3.2.
//
// Some examples:
//
// 1) Worst case for trig range reduction fast passes:
//
// Single precision
// > WorstCase(24, -6, 32, pi/32, 128); 
// numbermin :  10741887
// expmin    :  7
// Worst case:  0x1.47d0fep30
// numberofdigits :  -32.888
//
// Double precision
// > WorstCase(53, -8, 32, pi/128, 256);
// numbermin :  6411027962775774
// expmin    :  -53
// Worst case:  0x1.6c6cbc45dc8dep-1
// numberofdigits :  -66.4867
//
// 2) Worst case for exponential function range reduction:
//
// Single precision
// > WorstCase(24, 1, 8, log(2), 128);
// numbermin :  2907270
// expmin    :  -22
// Worst case:  0x1.62e43p-1
// numberofdigits :  -28.9678
//
// Double precision
// > WorstCase(53, 0, 11, log(2), 128);
// numbermin :  7804143460206699
// expmin    :  -51
// Worst case:  0x1.bb9d3beb8c86bp1
// numberofdigits :  -57.4931
//
verbosity=0;
procedure WorstCase(p, emin, emax, C, ndigits) {
    epsilonmin = 12345.0;
    Digits = ndigits;

    powerofBoverC = 2^(emin - p) / C;
    for e from emin - p + 1 to emax - p + 1 do {
        powerofBoverC = 2 * powerofBoverC;
        a = floor(powerofBoverC);
        Plast = a;
        r = round(1/(powerofBoverC - a), ndigits, RN);
        a = floor(r);
        Qlast = 1;
        Q = a;
        P = Plast * a + 1;
        while (Q < 2^p - 1) do {
            r = round(1/(r - a), ndigits, RN);
            a = floor(r);
            NewQ = Q * a + Qlast;
            NewP = P * a + Plast;
            Qlast = Q;
            Plast = P;
            Q = NewQ;
            P = NewP;
        };
        epsilon = C * abs(Plast - Qlast * powerofBoverC);
        if (epsilon < epsilonmin) then {
            epsilonmin = epsilon;
            numbermin = Qlast;
            expmin = e;
        };
    };
    display=decimal!;
    print("numbermin : ", numbermin);
    print("expmin    : ", expmin);
    display=hexadecimal!;
    print("Worst case: ", numbermin * 2^expmin);
    display=decimal!;
    ell = round(log2(epsilonmin), ndigits, RN);
    print("numberofdigits : ", ell);
};
