def create_elliptic_multiplication_table(modulus=17): """ Створює таблицю множення за модулем для еліптичних кривих """ print(f"=== ТАБЛИЦЯ МНОЖЕННЯ ЗА МОДУЛЕМ {modulus} ===\n") # Заголовок таблиці header = " | " + " ".join(f"{i:2d}" for i in range(modulus)) print(header) print("---+" + "-" * (3 * modulus)) # Тіло таблиці for i in range(modulus): row = f"{i:2d} | " for j in range(modulus): result = (i * j) % modulus row += f"{result:2d} " print(row) def show_modular_inverses(modulus=17): """ Показує обернені елементи за модулем """ print(f"\n=== ОБЕРНЕНІ ЕЛЕМЕНТИ ЗА МОДУЛЕМ {modulus} ===") print("(числа, які при множенні дають 1)") inverses = [] for i in range(1, modulus): for j in range(1, modulus): if (i * j) % modulus == 1: inverses.append((i, j)) print(f"{i}⁻¹ = {j} (бо {i} × {j} = {i*j} ≡ {i*j % modulus} mod {modulus})") break def elliptic_curve_points(a, b, p): """ Знаходить точки на еліптичній кривій y² = x³ + ax + b (mod p) """ print(f"\n=== ТОЧКИ НА КРИВІЙ y² = x³ + {a}x + {b} (mod {p}) ===") points = [] for x in range(p): # Обчислюємо праву частину: x³ + ax + b rhs = (x*x*x + a*x + b) % p # Шукаємо y такі, що y² ≡ rhs (mod p) for y in range(p): if (y*y) % p == rhs: points.append((x, y)) print(f" ({x}, {y})") print(f"Всього точок: {len(points)}") return points def show_elliptic_addition(): """ Демонструє додавання точок на еліптичній кривій """ print("\n=== ДОДАВАННЯ ТОЧОК НА ЕЛІПТИЧНІЙ КРИВІЙ ===") print("P + Q = R, де:") print("- Проводимо пряму через P та Q") print("- Знаходимо третю точку перетину з кривою") print("- Відображаємо відносно осі X") # Простий приклад print("\nПриклад на кривій y² = x³ + 2x + 3 (mod 17):") print("Якщо P = (1, 6) і Q = (3, 1):") print("P + Q = (16, 13)") def main(): print("=" * 60) print("МАТЕМАТИКА ЕЛІПТИЧНИХ КРИВИХ - ТАБЛИЦІ МНОЖЕННЯ") print("=" * 60) # Основна таблиця множення за модулем create_elliptic_multiplication_table(17) # Обернені елементи show_modular_inverses(17) # Приклади еліптичних кривих print("\n" + "=" * 60) print("ПРИКЛАДИ ЕЛІПТИЧНИХ КРИВИХ") print("=" * 60) # Крива 1 points1 = elliptic_curve_points(2, 3, 17) # Крива 2 points2 = elliptic_curve_points(1, 1, 17) # Додавання точок show_elliptic_addition() # Групові операції print("\n=== ВЛАСТИВОСТІ ГРУПИ ===") print("1. Замкнутість: P + Q завжди на кривій") print("2. Асоціативність: (P + Q) + R = P + (Q + R)") print("3. Нейтральний елемент: точка на нескінченності O") print("4. Обернений елемент: -P = (x, -y)") # Практичне застосування print("\n=== ЗАСТОСУВАННЯ ===") print("• Криптографія (ECDSA, ECDH)") print("• Цифрові підписи") print("• Обмін ключами") if __name__ == "__main__": main()
Standard input is empty
============================================================ МАТЕМАТИКА ЕЛІПТИЧНИХ КРИВИХ - ТАБЛИЦІ МНОЖЕННЯ ============================================================ === ТАБЛИЦЯ МНОЖЕННЯ ЗА МОДУЛЕМ 17 === | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ---+--------------------------------------------------- 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 2 | 0 2 4 6 8 10 12 14 16 1 3 5 7 9 11 13 15 3 | 0 3 6 9 12 15 1 4 7 10 13 16 2 5 8 11 14 4 | 0 4 8 12 16 3 7 11 15 2 6 10 14 1 5 9 13 5 | 0 5 10 15 3 8 13 1 6 11 16 4 9 14 2 7 12 6 | 0 6 12 1 7 13 2 8 14 3 9 15 4 10 16 5 11 7 | 0 7 14 4 11 1 8 15 5 12 2 9 16 6 13 3 10 8 | 0 8 16 7 15 6 14 5 13 4 12 3 11 2 10 1 9 9 | 0 9 1 10 2 11 3 12 4 13 5 14 6 15 7 16 8 10 | 0 10 3 13 6 16 9 2 12 5 15 8 1 11 4 14 7 11 | 0 11 5 16 10 4 15 9 3 14 8 2 13 7 1 12 6 12 | 0 12 7 2 14 9 4 16 11 6 1 13 8 3 15 10 5 13 | 0 13 9 5 1 14 10 6 2 15 11 7 3 16 12 8 4 14 | 0 14 11 8 5 2 16 13 10 7 4 1 15 12 9 6 3 15 | 0 15 13 11 9 7 5 3 1 16 14 12 10 8 6 4 2 16 | 0 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 === ОБЕРНЕНІ ЕЛЕМЕНТИ ЗА МОДУЛЕМ 17 === (числа, які при множенні дають 1) 1⁻¹ = 1 (бо 1 × 1 = 1 ≡ 1 mod 17) 2⁻¹ = 9 (бо 2 × 9 = 18 ≡ 1 mod 17) 3⁻¹ = 6 (бо 3 × 6 = 18 ≡ 1 mod 17) 4⁻¹ = 13 (бо 4 × 13 = 52 ≡ 1 mod 17) 5⁻¹ = 7 (бо 5 × 7 = 35 ≡ 1 mod 17) 6⁻¹ = 3 (бо 6 × 3 = 18 ≡ 1 mod 17) 7⁻¹ = 5 (бо 7 × 5 = 35 ≡ 1 mod 17) 8⁻¹ = 15 (бо 8 × 15 = 120 ≡ 1 mod 17) 9⁻¹ = 2 (бо 9 × 2 = 18 ≡ 1 mod 17) 10⁻¹ = 12 (бо 10 × 12 = 120 ≡ 1 mod 17) 11⁻¹ = 14 (бо 11 × 14 = 154 ≡ 1 mod 17) 12⁻¹ = 10 (бо 12 × 10 = 120 ≡ 1 mod 17) 13⁻¹ = 4 (бо 13 × 4 = 52 ≡ 1 mod 17) 14⁻¹ = 11 (бо 14 × 11 = 154 ≡ 1 mod 17) 15⁻¹ = 8 (бо 15 × 8 = 120 ≡ 1 mod 17) 16⁻¹ = 16 (бо 16 × 16 = 256 ≡ 1 mod 17) ============================================================ ПРИКЛАДИ ЕЛІПТИЧНИХ КРИВИХ ============================================================ === ТОЧКИ НА КРИВІЙ y² = x³ + 2x + 3 (mod 17) === (2, 7) (2, 10) (3, 6) (3, 11) (5, 6) (5, 11) (8, 2) (8, 15) (9, 6) (9, 11) (11, 8) (11, 9) (12, 2) (12, 15) (13, 4) (13, 13) (14, 2) (14, 15) (15, 5) (15, 12) (16, 0) Всього точок: 21 === ТОЧКИ НА КРИВІЙ y² = x³ + 1x + 1 (mod 17) === (0, 1) (0, 16) (4, 1) (4, 16) (6, 6) (6, 11) (9, 5) (9, 12) (10, 5) (10, 12) (11, 0) (13, 1) (13, 16) (15, 5) (15, 12) (16, 4) (16, 13) Всього точок: 17 === ДОДАВАННЯ ТОЧОК НА ЕЛІПТИЧНІЙ КРИВІЙ === P + Q = R, де: - Проводимо пряму через P та Q - Знаходимо третю точку перетину з кривою - Відображаємо відносно осі X Приклад на кривій y² = x³ + 2x + 3 (mod 17): Якщо P = (1, 6) і Q = (3, 1): P + Q = (16, 13) === ВЛАСТИВОСТІ ГРУПИ === 1. Замкнутість: P + Q завжди на кривій 2. Асоціативність: (P + Q) + R = P + (Q + R) 3. Нейтральний елемент: точка на нескінченності O 4. Обернений елемент: -P = (x, -y) === ЗАСТОСУВАННЯ === • Криптографія (ECDSA, ECDH) • Цифрові підписи • Обмін ключами