Algorytm mnożenia

Dyskusje o matematykach, matematyce... W szkole, na uczelni, w karierze... Czego potrzeba - talentu, umiejętności, szczęścia? Zapraszamy do dyskusji :)
Kera
Użytkownik
Użytkownik
Posty: 113
Rejestracja: 8 lis 2014, o 15:33
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 2 razy
Pomógł: 4 razy

Algorytm mnożenia

Post autor: Kera »

Poprzedni mój post wylądował w koszu :? , może ten nie wyląduje :lol: .
Kiedyś wymyśliłem inny sposób mnożenia, ale nie mam pojęcia czy jest znany czy nie, gdyż nigdzie w sieci nie znalazłem czegoś podobnego. Matematycy niech przymkną oko na mój opis, bo z pewnością przyprawi ich o ból głowy. Oto on:
Powiedzmy że chcemy pomnożyć dwie liczby 19-cyfrowe, grupujemy je na \(\displaystyle{ 5}\) równych części, począwszy od prawej strony do lewej, jeżeli ostatnia część zawiera mniej cyfr to dopisujemy zera na początku, np:
0123 4567 8910 1112 1314
\(\displaystyle{ \cdot }\)
0151 6171 8192 0212 2232
=
1871817045242859169563750742808452848

następnie podzielone w ten sposób liczby na grupy (4-cyfrowe) mnożymy od prawej do lewej strony. Wynik mnożenia grupujemy na dwie części, pierwsza (4-cyfrowa) od prawej do lewej strony jest częściowym wynikiem(na zielono), a drugą część wyniku dodajemy w następnym mnożeniu (na czerwono)
1314\(\displaystyle{ \cdot }\)2232 = 293 2848
1112\(\displaystyle{ \cdot }\)2232 + 1314\(\displaystyle{ \cdot}\)0212 + 293 = 276 0845
8910\(\displaystyle{ \cdot }\)2232 + 1112\(\displaystyle{ \cdot}\)0212 + 1314\(\displaystyle{ \cdot}\)8192 +276 = 3088 7428
4567\(\displaystyle{ \cdot}\)2232 + 8910\(\displaystyle{ \cdot}\)0212 + 1112\(\displaystyle{ \cdot}\)8192 + 1314 \(\displaystyle{ \cdot}\)6171 + 3088 = 2930 3750
0123 \(\displaystyle{ \cdot}\)2232 + 4567\(\displaystyle{ \cdot}\)0212 + 8910\(\displaystyle{ \cdot }\)8192 + 1112\(\displaystyle{ \cdot }\)6171 + 1314\(\displaystyle{ \cdot }\)0151 + 2930 = 8129 6956
0123\(\displaystyle{ \cdot }\)0212 + 4567\(\displaystyle{ \cdot }\)8192 + 8910\(\displaystyle{ \cdot }\)6171 + 1112\(\displaystyle{ }\)0151 + 8129 = 9259 8591
0123\(\displaystyle{ \cdot }\)8192 + 4567\(\displaystyle{ \cdot }\)6171 + 8910\(\displaystyle{ \cdot }\)0151+ 9259 = 3054 5242
0123\(\displaystyle{ \cdot }\)6171 + 4567\(\displaystyle{ \cdot }\)0151 + 3054 = 145 1704
0123\(\displaystyle{ \cdot }\)0151 + 145 =1 8718
jak przepiszemy zielone cyfry od ostatniego obliczenia do pierwszego powstanie wynik.
Co sądzicie o tym sposobie mnożenia???
a4karo
Użytkownik
Użytkownik
Posty: 22211
Rejestracja: 15 maja 2011, o 20:55
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 38 razy
Pomógł: 3755 razy

Re: Algorytm mnożenia

Post autor: a4karo »

Coż, wymyśliłes sposób mnożenia pisemnego przy podstawie 10000.
Gdybyśmy mieli tyle palców, to pewnie tak właśnie byśmy to robili.

Metoda jest ok, tylko strasznie trudno opanować tabliczkę mnożenia, która ma 100000000 elementów
Elayne
Użytkownik
Użytkownik
Posty: 926
Rejestracja: 24 paź 2011, o 01:24
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 75 razy
Pomógł: 274 razy

Re: Algorytm mnożenia

Post autor: Elayne »

Pomysł dzielenia czynników na mniejsze części nie jest nowy. Był znany w starożytności, współcześnie ma zastosowanie m.in. w algorytmach szybkiego mnożenia liczb całkowitych.
Kera
Użytkownik
Użytkownik
Posty: 113
Rejestracja: 8 lis 2014, o 15:33
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 2 razy
Pomógł: 4 razy

Re: Algorytm mnożenia

Post autor: Kera »

A czy implementując algorytm będzie on szybszy niż tradycyjne mnożenie??? Na architekturze procesorów x64 można liczbę podzielić na 9-cyfrowe bloki bez obawy że wynik będzie nieprawdziwy, co dla 27-cyfrowych liczb da tylko \(\displaystyle{ 9}\) mnożeń i \(\displaystyle{ 5}\) dodawań a w tradycyjnym \(\displaystyle{ 729}\) mnożeń i \(\displaystyle{ 365}\) dodawań, chyba że inaczej się to liczy?
a4karo
Użytkownik
Użytkownik
Posty: 22211
Rejestracja: 15 maja 2011, o 20:55
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 38 razy
Pomógł: 3755 razy

Re: Algorytm mnożenia

Post autor: a4karo »

CO masz na myśli pisząc "tradycyjne mnożenie"? Komputery nie mnożą "pisemnie" - maja na to zupełnie inne algorytmy.

Jeżeli natomiast pragniesz zaimplementować działania dla bardzo duużych liczb, to z pewnością podział na dłuższe bloki będzie szybszy niż mnożenie "po cyferce" (patrz post Elayne)
Elayne
Użytkownik
Użytkownik
Posty: 926
Rejestracja: 24 paź 2011, o 01:24
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 75 razy
Pomógł: 274 razy

Re: Algorytm mnożenia

Post autor: Elayne »

Odniosłem się tylko do kwestii dzielenia czynników na mniejsze części a nie do tego, jak i do czego te fragmenty czynników zostaną zastosowane. Zobacz np. na wiki opis algorytmu Karacuby: https://pl.wikipedia.org/wiki/Algorytm_Karacuby
Kera
Użytkownik
Użytkownik
Posty: 113
Rejestracja: 8 lis 2014, o 15:33
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 2 razy
Pomógł: 4 razy

Re: Algorytm mnożenia

Post autor: Kera »

dzięki za odpowiedzi, mimo że mój pomysł nie wnosi nic rewolucyjnego miło być autorem innego podejścia. :D

Dodano po 23 minutach 40 sekundach:
Miałby ktoś ochotę ten algorytm zaimplementować i wrzucić kod do mnożenia barrrrdzo dużych liczb? :roll: :mrgreen:
Awatar użytkownika
Borneq
Użytkownik
Użytkownik
Posty: 247
Rejestracja: 23 lip 2010, o 07:50
Płeć: Mężczyzna
Lokalizacja: geo:lat=0 geo:lon=0
Podziękował: 13 razy

Re: Algorytm mnożenia

Post autor: Borneq »

Trzeba by sprawdzić jak algorytm radzi sobie z liczbami większymi niż 64 bity. Do 64 bitów możemy użyć procesora, a jakie algorytmy używane są np. w GMP?
Kera
Użytkownik
Użytkownik
Posty: 113
Rejestracja: 8 lis 2014, o 15:33
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 2 razy
Pomógł: 4 razy

Re: Algorytm mnożenia

Post autor: Kera »

Borneq moim zdaniem algorytm działa doskonale, ograniczeniem na x64 jest podział mnożonych liczb na grupy max 9-cio cyfrowe. Np: najlepiej potraktować liczbę \(\displaystyle{ 100}\) cyfrową jako liczby 9-cio cyfrowe, powstanie w tedy \(\displaystyle{ 12}\) liczb 9-cio cyfrowych, a ich największa "reszta" przenoszona do następnego mnożenia nigdy nie przekroczy \(\displaystyle{ 2 ^{63} }\). Jedynym ograniczeniem jest czas i wielkość mnożonych liczb. Algorytm opracowałem wiele lat temu i byłbym szczerze zobowiązany poznać jego działanie w praktyce. Całkiem możliwe że można go jeszcze udoskonalić i przyspieszyć, a na pewno w przypadku podnoszenia liczb do kwadratu.
Awatar użytkownika
Borneq
Użytkownik
Użytkownik
Posty: 247
Rejestracja: 23 lip 2010, o 07:50
Płeć: Mężczyzna
Lokalizacja: geo:lat=0 geo:lon=0
Podziękował: 13 razy

Re: Algorytm mnożenia

Post autor: Borneq »

Myślę że bez większych zmian można by zmienić z systemu dzieisętnego na dwójkowy i działałby na 32 bitowych liczbach. Tylko czy mnożenie w GMP nie używa już takiego algorytmu? Ten algoorytm ma złożoność kwadratową na kilkusetcyfrowych liczbach? W GMP jest używany jakiś, chyba podobny algorytm na mnożenie, ale dla większych liczb używa bardzo skomplikowanego bazującego na Szybkiej Transformacie Fouriera. Ten algorym wolno się "rozpędza", tak że dla kilkusetcyfrowych liczb jeszcze lepiej używa się tego prostszego, natomiast dla naprawdę wielkich liczb (wiele milionów cyfr rozwinięcia \(\displaystyle{ \pi}\)) używa się tego skomplikowanego.
Kera
Użytkownik
Użytkownik
Posty: 113
Rejestracja: 8 lis 2014, o 15:33
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 2 razy
Pomógł: 4 razy

Re: Algorytm mnożenia

Post autor: Kera »

Może jakieś pomysły udoskonalające algorytm?
Kera
Użytkownik
Użytkownik
Posty: 113
Rejestracja: 8 lis 2014, o 15:33
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 2 razy
Pomógł: 4 razy

Re: Algorytm mnożenia

Post autor: Kera »

Panie i Panowie, czy aby na pewno to dział "Dyskusje o matematyce"?
Ja nie jestem Matematykiem przez wielkie "M", nawet brak mi wiedzy w tym kierunku, dlatego się pytam czy widzicie możliwość optymalizacji tego algorytmu mnożenia. Mile widziana każda podpowiedź, choćby nawet niedorzeczna, bo te są czasami przełomowe.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10226
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

Re: Algorytm mnożenia

Post autor: Dasio11 »

Odpowiedź na to pytanie już padła: Algorytm Karacuby, Szybka Transformata Fouriera.
Kera
Użytkownik
Użytkownik
Posty: 113
Rejestracja: 8 lis 2014, o 15:33
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 2 razy
Pomógł: 4 razy

Re: Algorytm mnożenia

Post autor: Kera »

Przydał się komuś ten sposób mnożenia? :wink:
Zaimplementował go ktoś, jeśli tak to prosiłbym o podesłanie kodu lub działającego programu.
Elayne
Użytkownik
Użytkownik
Posty: 926
Rejestracja: 24 paź 2011, o 01:24
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 75 razy
Pomógł: 274 razy

Re: Algorytm mnożenia

Post autor: Elayne »

To co pokazałeś to zwykłe mnożenie pisemne dwóch liczb z tą różnicą, że zamiast mnożyć pojedyncze cyfry liczb mnożymy grupy złożone z czterech cyfr [Analogia do rysunku poniżej]. Z czego, z jakiego powodu miało to być szybsze od tradycyjnego mnożenia?
ODPOWIEDZ