// Cuenta productos de un dígito por un dígito. Es un conteo exacto: no depende de la máquina.
#include <cstdio>
#include <random>

#include "karatsuba.h"

static Digits random_number(int n, std::mt19937& rng) {
    Digits a(n);
    for (int& digit : a) {
        digit = static_cast<int>(rng() % 10);
    }
    a[n - 1] = 1 + static_cast<int>(rng() % 9);
    return a;
}

int main() {
    std::mt19937 rng(2026);
    std::printf("%8s %14s %8s %14s %8s\n", "n", "escuela", "razon", "karatsuba", "razon");
    long long previous_school = 0;
    long long previous_kar = 0;
    for (int n = 16; n <= 65536; n *= 2) {
        Digits x = random_number(n, rng);
        Digits y = random_number(n, rng);
        long long school = 0;
        long long kar = 0;
        Digits slow = n <= 8192 ? school_multiply(x, y, school) : Digits{};
        if (n > 8192) {
            school = static_cast<long long>(n) * n;
        }
        Digits fast = karatsuba(x, y, 3, kar);
        if (n <= 8192) {
            assert(slow == fast);
        }
        std::printf("%8d %14lld %8.2f %14lld %8.2f\n", n, school,
                    previous_school == 0 ? 0.0 : static_cast<double>(school) / static_cast<double>(previous_school),
                    kar,
                    previous_kar == 0 ? 0.0 : static_cast<double>(kar) / static_cast<double>(previous_kar));
        previous_school = school;
        previous_kar = kar;
    }
}
