Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачник_МОК.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
394.39 Кб
Скачать

Приложение 2

Листинг программы для решения задач 5.3, 5.4 на языке C#

Программа реализует обобщенный алгоритм Евклида, сложение и удвоение точек.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

public class Operations

{

public int Mod(int a,int p)

{

if (a < 0) { a = a + p; }

return a;

}

public int Evc(int h, int k) //Алгоритм Евклида

{

int[,] mt = new int[20, 7];

for (int i = 0; i < 20; i++)

{

for (int j = 0; j < 7; j++) mt[i, j] = -1;

}

mt[0, 0] = 1;

mt[0, 1] = 0;

mt[0, 2] = h;

mt[0, 3] = 0;

mt[0, 4] = 1;

mt[0, 5] = k;

mt[0, 6] = (h - (h % k)) / k;

int n = 0;

while (mt[n, 5] != 0)

{

n++;

int m = 0;

for (m = 0; m < 3; m++)

{

mt[n, m] = mt[n - 1, m + 3];

}

for (m = 3; m < 6; m++)

{

mt[n, m] = mt[n - 1, m - 3] - mt[n - 1, m] * mt[n - 1, 6];

}

if (mt[n, 5] != 0)

{

mt[n, 6] = (mt[n, m - 4] - (mt[n, 2] % mt[n, 5])) / mt[n, 5];

}

}

k = mt[n - 1, 4];

if (k < 0) {k += h; }

return (k);

}

}

class Program

{

static void Main(string[] args)

{

Operations op1 = new Operations();

int x=0;

int y=0;

int k;

int p = 199;

Console.WriteLine("Если требуется удвоение, нажмите 0, если сложение 1");

k = Convert.ToInt32(Console.ReadLine());

if (k==0) //Удвоение

{

Console.WriteLine("Введите координаты, для удвоения");

int x1;

Console.Write("x1=");

x1 = Convert.ToInt32(Console.ReadLine());

int y1;

Console.Write("y1=");

y1 = Convert.ToInt32(Console.ReadLine());

int a;

int a1 = 2*y1 % p;

a1 = op1.Evc(p, a1);

a = (3 * x1 * x1) % p;

a = a + 1;

a = (a * a1) % p;

x = (a * a) % p;

x = x - ((2 * x1)%p);

x = op1.Mod(x, p);

y = x1 - x;

y = op1.Mod(y, p);

y = (y * a) % p;

y = y - y1;

y = op1.Mod(y, p);

}

else //Сложение

{

Console.WriteLine("Введите координаты, для сложения");

int x1;

Console.Write("x1=");

x1 = Convert.ToInt32(Console.ReadLine());

int y1;

Console.Write("y1=");

y1 = Convert.ToInt32(Console.ReadLine());

int x2;

Console.Write("x2=");

x2 = Convert.ToInt32(Console.ReadLine());

int y2;

Console.Write("y2=");

y2 = Convert.ToInt32(Console.ReadLine());

int a;

int a1 = x2-x1;

a1 = op1.Mod(a1, p);

a1 = op1.Evc(p, a1);

a = y2 - y1;

a = op1.Mod(a, p);

a = (a * a1) % p;

x = (a * a) % p;

x = x - x1;

x = op1.Mod(x, p);

x = x - x2;

x = op1.Mod(x, p);

x = x % p;

y = (x1 - x);

y = op1.Mod(y, p);

y = (y * a) % p;

y = y - y1;

y = op1.Mod(y, p);

}

Console.WriteLine("x=" + x);

Console.WriteLine("y=" + y);

Console.ReadKey();

}

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]