import timeit

def benchmark_exponentiation_vs_shifting():
    # Test across small, medium, large, and very large exponents
    n_values = [10, 100, 1000, 10000]
    iterations = 1_000_000

    print(f"{'n value':<10} | {'1 << n (Shift)':<18} | {'2 ** n (Power)':<18} | Speedup Factor")
    print("-" * 65)

    for n in n_values:
        # Benchmark bit shifting
        shift_time = timeit.timeit(f"1 << {n}", number=iterations)
        
        # Benchmark exponentiation
        pow_time = timeit.timeit(f"2 ** {n}", number=iterations)
        
        # Calculate how many times faster bit shifting is
        speedup = pow_time / shift_time
        
        print(f"{n:<10} | {shift_time:.4f} sec        | {pow_time:.4f} sec        | {speedup:.1f}x faster")

if __name__ == "__main__":
    benchmark_exponentiation_vs_shifting()
