kongurencja modulo

0

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;
            }
            
        } 
    }

}
 
0

Co dokładnie Ci nie działa?

0

ta funkcja coś mi sie tu chyba pomieszało:

   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;
            }
 
        } 
0

Ok, a możesz opisać słowami co chcesz, żeby tak metoda robiła z parametrami, które dostaje? (A nie wklejać treść całego zadania ;))

0

Dla x=1 do p-1: podstawiać ma x do wzoru anxn+an-1 xn-1+…+a1x=a0 modulo p i sprawdzać ma czy te równanie jest spełnione jeśli tak to ma wypisać x dla ktorego jest spełnione.

Chociaż prosiłbym żeby mi ktoś napisał jak mogę wyznaczyć ostatni element tablicy a w funkcji.

0

Najlepiej tak:

tablica.Last()
0

a dlaczego jak w tej funkcji zrobiłem tak:

 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++)
        {
            Console.WriteLine("\n"+(a.Last()-x) + " jest ostatnim elementem tablicy"); //wypisuje mi zawsze że jest to -1 a jak pize a.Last() to że 0;
            if (w!=a0)
            {
               w += (a.Last()-x) * (x ^ (n.Last()-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;
            }
            
        } 
1

Szklana kula do polerki, co przekazujesz jako a?

            int[] tablica = new[] {1, 2, 3, 4, 5, 6, 7, 8};
            var lenght_1 = tablica[tablica.Length-1];//zwraca 8
            var last = tablica.Last();//zwraca 8
            var last_1 = tablica.Last()-1;//zwraca 7
0

ok dzieki nie wiem dlaczego wczesniej mi nie działało jak tak napisałem a mógłby mi ktoś jeszcze jak napisać: jeśli wypisze pierwszy element tablicy w petli for to przerwij pętle

0

http://msdn.microsoft.com/pl-pl/library/d96yfwee.aspx

Przy czym staraj się nie używać "goto" (zawsze się da uniknąć "goto").

1 użytkowników online, w tym zalogowanych: 0, gości: 1