witam
Mam do zrobienia zadanie o treści:
Algorytm, który rozwiązuje kongruencję postaci anxn+an-1 xn-1+…+a1x=a0 modulo p, gdzie p jest liczbą pierwszą.
WE: Dane: n- liczba składników, a0- wyraz wolny
Współczynniki i potęgi wprowadzić w postaci dwóch tablic długości n:
T_wsp[i]=ai dla i=1 do n
T_pot[i]=ni dla i=1 do n
WY: wypisać wszystkie rozwiązania
Przebieg algorytmu:
1.Wprowadzenie danych:
• Podaj moduł p
2. Sprawdzenie czy p jest liczba pierwszą: jeżeli tak licz dalej, jeżeli nie podaj inny moduł. (w wersji uproszczonej można to pominąć, a w zamian wpisać informację, że p musi być pierwsza)
3. Wprowadzenie danych:
• n
• tablica współczynników (w trakcie wprowadzania redukować współczynniki modulo p),
• a0 (zredukować modulo p)
4. Sprawdzenie czy x=0 jest rozwiązaniem (wystarczy sprawdzić czy a0 po zredukowaniu jest równe 0) jeżeli tak pisz: 0 jest rozwiązaniem i przejdź dalej, jeżeli nie przejdź dalej.
5. Wprowadzenie danych:
• tablica potęg (w trakcie wprowadzania redukować potęgi modulo p-1)
6. Dla x=1 do p-1: podstawiaj x do kongruencji i sprawdzaj czy kongruencja jest spełniona.
Jeżeli x spełnia kongruencję pisz: x jest rozwiązaniem.
i Napisałem taki kod do niego ale nie wiem czemu mi nie działa, czy moglibyście go poprawić
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Wprowadz liczbę składników: ");
int n = int.Parse(Console.ReadLine());
Console.WriteLine("Podaj moduł p: ");
int p = int.Parse(Console.ReadLine());
Console.WriteLine("Wprowadz wyraz wolny: ");
int a0 = (int.Parse(Console.ReadLine()) % p);
int[] T_wsp = new int[n]; //a_i
int[] T_pot = new int[n]; //n_i
while (!Matematyka.czy_pierwsza(p))
{
Console.WriteLine("Wprowadzona liczba nie jest liczbą pierwszą.\nWprowadz ponownie liczbę: ");
p = int.Parse(Console.ReadLine());
}
for (int i = 0 ; i < n;i++)
{
Console.WriteLine("Wprowadz " + (i+1) + " wspolczynnik");
T_wsp[i] = (int.Parse(Console.ReadLine())%p);
}
for (int i = 0; i < n; i++)
{
Console.WriteLine("Wprowadz " + (i+1) + " potege");
T_pot[i] = (int.Parse(Console.ReadLine()) % (p-1));
}
Matematyka.kongurencja(T_wsp, T_pot, p, a0,n);
Console.ReadLine();
}
}
}
class Matematyka
{
static int w;
public static bool czy_pierwsza(int p)
{
if (p < 0)
{
Console.WriteLine("Wprowadz liczbę dodatnią: ");
return false;
}
if (p==1)
{
Console.WriteLine("Wprowadzona liczba jest liczbą pierwszą\nLiczbą tą jest: " + p);
return true;
}
for (int i = 2; i * i <= p; i++)
{
if (p % i == 0)
{
return false;
}
}
Console.WriteLine("Wprowadzona liczba jest liczbą pierwszą\nLiczbą tą jest: " + p);
return true;
}
public static void kongurencja(int[] a, int[] n, int p, int a0, int nn)
{
if (a0%p==0)
{
Console.WriteLine("0 jest rozwiazaniem");
}
for (int x = 1; x <= p-1; x++)
{
if (w!=a0)
{
w += (a[nn-x]) * (x ^ (n[nn-x]));
}
else
{
Console.WriteLine("\n"+x + " jest rozwiazaniem tej kongurencji");
break;
}
Console.WriteLine("\nwynik kongurencji dla " + x + " =" + w);
if (w == a0)
{
Console.WriteLine("\n" + x + " jest rozwiazaniem tej kongurencji");
break;
}
}
}
}