Edit the code to include a new method `windowed_point_multiplication(self, k: int, P: tuple) -> tuple` that computes elliptic curve point multiplication using the windowing method. That is, given a window size w with a default value of 4, precompute all 2^w powers the given point. Then, as you compute the double-and-add procedure similar to in the function `point_multiplication`, use the pre-computed values. Feel free to conver the given scalar `k` to binary for the double-and-add procedure. Ensure `generate_keypair` and `validate_keypair` use `windowed_point_multiplication`.
