fork download
  1. def create_elliptic_multiplication_table(modulus=17):
  2. """
  3. Створює таблицю множення за модулем для еліптичних кривих
  4. """
  5. print(f"=== ТАБЛИЦЯ МНОЖЕННЯ ЗА МОДУЛЕМ {modulus} ===\n")
  6.  
  7. # Заголовок таблиці
  8. header = " | " + " ".join(f"{i:2d}" for i in range(modulus))
  9. print(header)
  10. print("---+" + "-" * (3 * modulus))
  11.  
  12. # Тіло таблиці
  13. for i in range(modulus):
  14. row = f"{i:2d} | "
  15. for j in range(modulus):
  16. result = (i * j) % modulus
  17. row += f"{result:2d} "
  18. print(row)
  19.  
  20. def show_modular_inverses(modulus=17):
  21. """
  22. Показує обернені елементи за модулем
  23. """
  24. print(f"\n=== ОБЕРНЕНІ ЕЛЕМЕНТИ ЗА МОДУЛЕМ {modulus} ===")
  25. print("(числа, які при множенні дають 1)")
  26.  
  27. inverses = []
  28. for i in range(1, modulus):
  29. for j in range(1, modulus):
  30. if (i * j) % modulus == 1:
  31. inverses.append((i, j))
  32. print(f"{i}⁻¹ = {j} (бо {i} × {j} = {i*j} ≡ {i*j % modulus} mod {modulus})")
  33. break
  34.  
  35. def elliptic_curve_points(a, b, p):
  36. """
  37. Знаходить точки на еліптичній кривій y² = x³ + ax + b (mod p)
  38. """
  39. print(f"\n=== ТОЧКИ НА КРИВІЙ y² = x³ + {a}x + {b} (mod {p}) ===")
  40.  
  41. points = []
  42. for x in range(p):
  43. # Обчислюємо праву частину: x³ + ax + b
  44. rhs = (x*x*x + a*x + b) % p
  45.  
  46. # Шукаємо y такі, що y² ≡ rhs (mod p)
  47. for y in range(p):
  48. if (y*y) % p == rhs:
  49. points.append((x, y))
  50. print(f" ({x}, {y})")
  51.  
  52. print(f"Всього точок: {len(points)}")
  53. return points
  54.  
  55. def show_elliptic_addition():
  56. """
  57. Демонструє додавання точок на еліптичній кривій
  58. """
  59. print("\n=== ДОДАВАННЯ ТОЧОК НА ЕЛІПТИЧНІЙ КРИВІЙ ===")
  60. print("P + Q = R, де:")
  61. print("- Проводимо пряму через P та Q")
  62. print("- Знаходимо третю точку перетину з кривою")
  63. print("- Відображаємо відносно осі X")
  64.  
  65. # Простий приклад
  66. print("\nПриклад на кривій y² = x³ + 2x + 3 (mod 17):")
  67. print("Якщо P = (1, 6) і Q = (3, 1):")
  68. print("P + Q = (16, 13)")
  69.  
  70. def main():
  71. print("=" * 60)
  72. print("МАТЕМАТИКА ЕЛІПТИЧНИХ КРИВИХ - ТАБЛИЦІ МНОЖЕННЯ")
  73. print("=" * 60)
  74.  
  75. # Основна таблиця множення за модулем
  76. create_elliptic_multiplication_table(17)
  77.  
  78. # Обернені елементи
  79. show_modular_inverses(17)
  80.  
  81. # Приклади еліптичних кривих
  82. print("\n" + "=" * 60)
  83. print("ПРИКЛАДИ ЕЛІПТИЧНИХ КРИВИХ")
  84. print("=" * 60)
  85.  
  86. # Крива 1
  87. points1 = elliptic_curve_points(2, 3, 17)
  88.  
  89. # Крива 2
  90. points2 = elliptic_curve_points(1, 1, 17)
  91.  
  92. # Додавання точок
  93. show_elliptic_addition()
  94.  
  95. # Групові операції
  96. print("\n=== ВЛАСТИВОСТІ ГРУПИ ===")
  97. print("1. Замкнутість: P + Q завжди на кривій")
  98. print("2. Асоціативність: (P + Q) + R = P + (Q + R)")
  99. print("3. Нейтральний елемент: точка на нескінченності O")
  100. print("4. Обернений елемент: -P = (x, -y)")
  101.  
  102. # Практичне застосування
  103. print("\n=== ЗАСТОСУВАННЯ ===")
  104. print("• Криптографія (ECDSA, ECDH)")
  105. print("• Цифрові підписи")
  106. print("• Обмін ключами")
  107.  
  108. if __name__ == "__main__":
  109. main()
Success #stdin #stdout 0.14s 14148KB
stdin
Standard input is empty
stdout
============================================================
МАТЕМАТИКА ЕЛІПТИЧНИХ КРИВИХ - ТАБЛИЦІ МНОЖЕННЯ
============================================================
=== ТАБЛИЦЯ МНОЖЕННЯ ЗА МОДУЛЕМ 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)
• Цифрові підписи
• Обмін ключами