W dniu 2013-02-27 17:30,
omnia_...@interia.pl pisze:
>
>>> Mam jeszcze pytanie czy pytanie o to czy istnieje liczba
>>> Mersenne'a
>>
>>> podzielna przez dowolną liczbę nieparzystą jest rozstrzygalne w
>>> jakiś
>>
>>> łatwy sposób, czy to problem otwarty?
>>
>>
>>
>> Dość łatwy. Nie trzeba przekombinować, tylko wprost
>>
>> policzyć 2^n modulo dzielnik. Jeśli wynik to 1, mamy podzielność
>>
>> liczby 2^n-1 przez dzielnik.
>
> Tak jak pisaliśmy wcześniej, ale chodzi mi o to skąd mamy pewność, że
> algorytm dla dowolnie wybranego dzielnika się zatrzyma?
Oj, źle zrozumiałem pytanie.
Napisałem przydługi post z linkami do grupy multiplikatywnej,
cyklicznej, chińskiego twierdzenie o resztach etc.
Ale wszytko sprowadziło się do udowodnienia tego:)
http://pl.wikipedia.org/wiki/Twierdzenie_Eulera_%28teoria_liczb%29
Dla każdej liczby m względnie pierwszej z _a_ mamy
a^phi[n] -1 = 0 (mod n)
phi[n] to funkcja Eulera, czyli liczba <=n liczb względnie
pierwszych z _n_.
http://pl.wikipedia.org/wiki/Funkcja_%CF%86
Nieparzysta liczba _n_ jest względnie pierwsza z 2, więc
zawsze
2^phi[n] - 1 jest podzielne przez _n_.
Co ważne, phi[n]<n.
Dodatkowo, k=phi[n] wyznacza nam liczbę Mersenne'a
która dzieli się na _n_, ale nie daje nam najmniejeszej
takiej liczby.
Choćby przypadek z wiki:
http://en.wikipedia.org/wiki/Mersenne_prime#Factorization_of_composite_Mersenne_numbers
In[21]:= x = 41602235382028197528613357724450752065089;
Funkcja Eulera od tej liczbt jest dość duża
In[26]:= phi = EulerPhi[x]
Out[26]= 41602221299144638729525712747024114909856
CO nie dziwi patrząc na jej rozkład.
In[23]:= FactorInteger[x]
Out[23]= {{2989513, 1}, {249375127, 1}, {55803711703045241786952239,
1}}
Ala jak pamiętamy, istaniła znacznie mniejsza l.Mersennea
dzieląca się na x.
In[24]:= w = 41521;
PowerMod[2, w, x]
Out[25]= 1
:)
Jeśli przyjrzysz się dowodowi tego twierdzenia korzystającego
z grup, albo dowodowi Małego Twierdzenia Fermata, widać, że
niezłymi kandydatami na ta liczby są wszystkie dzielniki
liczby phi[n]. Co potwierdza nam też nasz przykład:
In[28]:= Mod[phi, w]
Out[28]= 0
In[29]:= FactorInteger[phi]
Out[29]= {{2, 5}, {3, 3}, {7, 1}, {11, 1}, {13, 1},
{__41521__, 3}, {674649119, 1}, {996064193881, 1}}
Chwile bym musiał się zastanowić, czy nie mogą
istnieć inne wykładniki dla liczb Mersenne'a
podzielnych przez zadane n, ale wątpie.
A jeśli tak, to znacząco przyspiesza algorytm wyszukiwania.
In[141]:= x = 38746378592365932659594769345;
phi = EulerPhi[x]
Out[142]= 20664735249261830751783876960
In[143]:= wykladniki = Divisors[phi];
In[144]:= reszty = PowerMod[2, wykladniki, x] - 1;
In[145]:= Pick[wykladniki, reszty, 0]
Out[145]= {861030635385909614657661540, 1722061270771819229315323080, \
2583091906157728843972984620, 3444122541543638458630646160, \
5166183812315457687945969240, 6888245083087276917261292320, \
10332367624630915375891938480, 20664735249261830751783876960}
Dla x=
5645456435345738746378592365932659594769345;
najmniejszy wykładnik
299906685318216811177603563089766662340
x=78564556456435345738746378592365932659594769345
m=388409043155410697993432090901387109356392340
Czas działania w sekundach, ale przy tym zapisie
bardzo dużo zależy od liczby dzielników.
>
> I wykonałeś te obliczenia tą metodą "bruteforce"? Nie rozumiem w
> ogóle jak znalazłeś tą liczbę Mersenne'a. Nie sądziłem, że takie
> liczby są w zasięgu do jakichkolwiek dzieleń.
Jak wspomnialem na początku, zaszla pomyłka. Twoje pytania
o istnienie rozwiązania zrozumialem jako pytania
o sprawne sprawdzenia podzielności zadanej pary.
Te liczby nie są takie duże, nie liczyłem oczywiście
2^6882692757836160374606182621936716251267028759,
ale
2^6882692757836160374606182621936716251267028759 mod
41602235382028197528613357724450752065089
A do tego na dobrą sprawę potrzebowałem liczb 82 cyfrowych.
> Czym jest "UInt<200>"?
Liczba całkowita bez znaku o 32*200 bitach,
niecałe dwa tysiące liczb dziesiętnych,
z dość lekkiej, małej i niedopracowanej biblioteczki.
Do porządnych zastosowań są kombajny jak to:
http://gmplib.org/
A w obliczaniach używa się większych liczby.
Największa liczba Mersenne'a zajmuje kilka megabajtów,
17 milionów cyfr dziesiętnych.
A policzenie pi do miliarda miejsc po przecinku nie
przekracza możliwości domowego komputera.
pzdr
bartekltg