Dlaczego ten algorytm nie działa

0
import static java.lang.Math.*;

public class Alg {

	public static void main(String[] args) {
		
		double a = 0;


		for (int i = 0; i < 100000; i++)
		{
			a = Math.pow(i, 9);
			if(a%1363 == 582)
			{
				System.out.println("Mamy to " + i);
				break;
			}
		}	

	}

}

Generalnie powinno mi zwracać liczbę 72105. A zwraca 607. Tylko, że jak na kalkulatorze podniosę 607 do potęgi 9 i wezmę modulo 1363 to ni cholery nie wychodzi 582, tylko jakieś krzaki. Proszę o pomoc co tu nie gra, bo algorytm jest bardzo krótki.

2

Problem w tym, że wykonujesz modulo na wartości typu zmiennoprzecinkowego (double) zamiast całkowitego (np. long)

0

W jaki sposób najlepiej zamienić duże liczby typu 5.268517544998918E43 z double na long bez utraty danych ? Math.round() nie działa, rzutowanie do long to też nie to.

1

W ogólności nie zamienisz, bo zakresu zmiennej Ci braknie — nie możesz za bardzo oczekiwać, że long long int będzie dłuższy niż 64 bity (znaczy, nikt mu nie zabrania być, ale nie znam żadnego systemu, na którym by to tak działało…), a 2⁶⁴ « 5 · 10⁴³ (tak prawie ze trzy kwadryliony razy). Potrzebujesz do tego jakiejś biblioteki dużych liczb, na przykład GMP.

0

Skąd wziąłeś wynik 72105? Powinno być 1229 http://ideone.com/Got1Co.

for i in range(1,100000):
    if (i**9)%1363 == 582:
        print(i)
        break;

Jaki kalkulator nie potrafi policzyć 6079 mod 1363?

0

Jeśli potrzebujesz znać wynik operacji x^p mod m to możesz przy każdym mnożeniu podczas potęgowania modulo. Wynika to z faktu, że:

((x mod m) * (x mod m)) mod m = (x*x) mod m

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