Wpis z mikrobloga

Krótki (może niepotrzebny) wstęp o co chodzi:

Witam serdecznie, do mojej pracy licencjackiej potrzebują wykonywać pewne obliczenia na bardzo dużych liczbach. Nie wchodząc w szczegóły powiedzmy że mam dość skomplikowany wielomian dwóch zmiennych, do którego wsadzam małe liczby np (2,1) i dostaję nowe dwie liczby (które niestety będą duuże). Teraz mogę sobie ten wielomian modyfikować w określony sposób (wystarczy aby wyniki zgadzały się co do modulo dla określonej liczby) aby wyniki były mniejsze, bo jeśli miałbym teraz te wielkie liczby kolejny raz "przemielić" przez ten wielomian to otrzymałbym astronomicznie duże wyniki.

Teraz moje pytanie:

Czy znacie jakiś program matematyczny, który z takimi sporymi wynikami sobie poradzi? Próbowałem liczyć sobie różne rzeczy w R ale niestety przy sporych liczbach dokładność przy dzieleniu jest zbyt mała.

To może mały przykład bo własnie sobie zdałem sprawę, że nie potrafię za dobrze wytłumaczyć słowami o co mi chodzi.

Mam wielomian dwóch zmiennych na dwie zmienne, przekształcający jeden punkt na drugi.

Używając tego przekształcenia otrzymujemy następujący ciąg punktów (0,0)->(0,1)->(1,0)->(1,1)->(2,0)->(2,-15)->(4468307,-26359440)

I tutaj pojawia się problem bo jeśli wsadziłbym te liczby do mojego wielomianu to otrzymałbym jakieś liczby rzędu e50. Mogę modyfikować wielomian tak aby wyniki zgadzały się co do modulo 16.
Muszę też pamiętać żeby dopisując coś to niego nie wpłynąć na zmianę poprzednich punktów. Mogę więc dodać do niego człon w stylu:
(16X(X-1)Yc , 16X(X-1)Yd) wtedy nie zmienimy wartości wyniku modulo 16 oraz wszystkie poprzednie przekształcenia zostaną zachowane.
Gdzie c i d to dowolne liczby należące do Z2 (w mianowniku nie mogą mieć liczby parzystej)

No i teraz chciałbym tak dobrać c i d żeby punkt (2,-15) został przekształcony na coś możliwie małego. Jednak jeśli przykładowo wezmę d=114273/33 to będę kazał komputerowi wykonywać obliczenia na tak dużych liczbach, że zatraci on dokładność, która jest mi potrzebna i zacznie on wykazywać równości liczb, które tak naprawdę równe nie są.

Informatyk ze mnie żaden więc chciałem się dowiedzieć czy istnieje taki program, który byłby w stanie coś takiego liczyć czy może muszę jakoś analitycznie pozmieniać te wielomiany bo inaczej nie da rady?

Dziękuję jeśli ktoś dotrwał do końca.

#matematyka #informatyka #programowanie
  • 6
  • Odpowiedz
@CiekawskiJ: @BazaltowyTubylec: @krowa_pro: Dzięki za odpowiedzi, chciałem używać liczb zmiennoprzecinkowych żeby uzyskiwać jak najmniejsze wyniki, ale skoro python pozwoliłby mi pracować na dowolnie dużych liczbach to chyba mogę tylko delikatnie zmodyfikować te wielomiany i otrzymywać kolejne duże liczby i się tym nie przejmować.

Znam podstawy c++, zaraz ogarnę jakiś tutorial pythona od której strony się za to zabrać i zobaczymy co z tego wyjdzie. Dzięki jeszcze raz :D
  • Odpowiedz
@LaChupacabra: Nie wiem jak ten konkretny przypadek, ale nawet jeśli chcesz otrzymywać "małe" wyniki to na sam czas obliczeń możesz wszystko przemnożyć np. przez 10^10, a na koniec podzielić. Obliczenia wykonasz na dużych liczbach (nawet całkowitych), a potem sobie z powrotem zamienisz na zmiennoprzecinkowe o małych wartościach i wielu miejscach po przecinku.
  • Odpowiedz