Ponieważ jestem autorem programu y-cruncher, o którym wspomniałeś, dodam moje 2 centy.
Dla takiego dużego zadania, dwie największe przeszkody, które muszą zostać poruszone są następujące:
- pamięci
- Run-time Złożoność
pamięci
2 bilion cyfr to ekstremalnie - co najmniej. To dwa razy więcej niż current record set by Shigeru Kondo and myself back in 2010. (Zajęło nam to ponad 9 dni na wyliczenie 1 tryliona cyfr za pomocą y-crunchera).
W tekście zwykłym, to około 1,8 TiB w systemie dziesiętnym. W spakowanej reprezentacji binarnej to 773 GiB.
Jeśli zamierzasz wykonywać operacje arytmetyczne na liczbach tej wielkości, będziesz potrzebować 773 GiB dla każdego operandu nie licząc pamięci scratch.
Możliwe, że Y-cruncher potrzebuje 8.76 TiB pamięci, aby wykonać to obliczenie wszystkie w pamięci RAM. Można więc oczekiwać, że inne implementacje będą wymagały tego samego lub przynajmniej przyjmą współczynnik 2.
Powiedziałem, że wątpię, że będziesz miał dość barana. A nawet gdybyś tak zrobił, byłby to zdecydowanie NUMA. Alternatywą jest użycie dysku. Ale to nie jest trywialne, aby być wydajnym, trzeba traktować pamięć jako pamięć podręczną i przenosić wszystkie dane przesyłane między pamięcią a dyskiem.
Run-time Złożoność
Tutaj mamy inny problem. Dla 2 trylionów cyfr potrzebny będzie bardzo szybki algorytm. Nie tylko jakikolwiek szybki algorytm, ale quasi-liniowy algorytm wykonawczy.
Twoja obecna próba trwa około O(N^2)
. Więc nawet jeśli masz dość pamięci, nie skończy się to za twojego życia.
Standardowe podejście do obliczania e
wysokiej precyzji przebiega O(N log(N)^2)
łącząc następujące algorytmy:
szczęście GMP już używa FFT oparte dużą mnożenia. Ale nie ma dwóch ważnych funkcji:
- Obliczenia na dysku (zamiana) na użycie dysku, gdy brakuje pamięci.
- Nie jest zsynchronizowany.
Drugi punkt nie jest tak ważny, ponieważ można po prostu dłużej czekać. Ale ze względów praktycznych prawdopodobnie będziesz musiał wdrożyć własne. I to właśnie zrobiłem, gdy pisałem y-crunchera.
Powiedział, że istnieje wiele innych luźne końce, które również muszą być załatwione:
- The końcowego podziału wymagać będzie szybki algorytm jak metoda Newtona.
- Jeśli chcesz obliczyć w systemie dwójkowym, będziesz musiał wykonać konwersję podstawową.
- Jeśli obliczenia zajmie dużo czasu i dużo zasobów, być może trzeba będzie wprowadzić tolerancję błędów w celu obsługi awarii sprzętu.
Nie znam odpowiedzi w obu przypadkach, ale czy szukasz binarnej ekspansji * e * lub jej dziesiętnego rozwinięcia? –
Wzmianka o twórcy y-crunchers @Mysticial – inf
@PascalCuoq Szukam 2 trylionów po przecinku. – iblue