Article View: pl.comp.lang.c
Article #308804Re: Działania na wielkich liczbach
From: bartekltg
Date: Fri, 30 Sep 2016 21:49
Date: Fri, 30 Sep 2016 21:49
81 lines
3076 bytes
3076 bytes
On 30.09.2016 21:46, Borneq wrote:
> Nie udało się z biblioteką MPIR. Wersja Release dla trybu Debug
> potrzebowała jakiejś biblioteki, która nie dała się skompilować, a
> wersja z najnowszych źródeł Githuba miała problemy kompilacji dla DLL i
> static.
> Więc użyłem boost/multiprecision/cpp_int.hpp
> Rozkładam 5742507205757425072053 metodą szkolną więc najpierw
> wielokrotnie dzieląc przez 2 a potem przez nieparzyste liczby (choć
> pierwszych jest znacznie mniej) do pierwiastka z liczby.
> otrzymuję:
> 3 7 197 402529 3448409664461
> Kompilacja przez GCC: 0.201 s natomiast VC++ udało się zejść do 0.053 s
> Dlaczego GCC tak tu nieefektywny? 3.8 x
> Może warto jeszcze spróbować LLVM?
> A VC++ dla trybu 64 bit nawet 0.0367 s!
U mnie
3 7 197 402529 3448409664461 0.0529229s //wrersja cpp
3 7 197 402529 3448409664461 0.0805347s //wersja gmp
kompiluję prosto z QTcreatrora lub przez
g++ main.cpp -std=c++11 -O2 -lgmp -lgmpxx
Procesor mocno nienajnowszy AMD Phenom(tm) II X4 955.
Nie zapomniałęś o optymalizacji? ;>
>
> void factor(const cpp_int n)
> {
> cpp_int x = n;
Uwaga techniczna. Pobierasz stałą n, potem ją kopiujesz
do x i nigdy nie uzywasz ponownie.
Po to wymyślono przekazywanie przez wartość
void factor(cpp_int x)
{
:)
> while ((x % 2) == 0) {
> x /= 2;
> std::cout << 2 << " ";
> }
> cpp_int i, e;
> i = 3;
> e = sqrt(x);
> while (i <= e) {
> while ((x % i) == 0) {
> x /= i;
> e = sqrt(x);
> std::cout << i << " ";
> }
> i+=2;
> }
> if (x > 1)
> std::cout << x << " ";
> }
>
> Jednak podglądając kod assebmblera VC++ są tam dwie funkcje : do_divide
> i divide_unsigned_helper
> Czy w bibliotece cpp_int była by funkcja łącząca div i mod?
Trzeba szukać nieco dalej, w kalsie number<>
http://www.boost.org/doc/libs/1_62_0/libs/multiprecision/doc/html/boost_multiprecision/ref/number.html
divide_qr(x,y,q,r)
Ale jak podmieniłem, było wolniej ;-)
Kody:
http://pastebin.com/Z7DcaHWc
pzdr
bartekltg
Technical Details
Message-ID:
<nsmmki$q6o$1@node1.news.atman.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mailReferences:
<nsmfdj$hki$1@node1.news.atman.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mail From: bartekltg <bartekltg@gmail.com> Newsgroups: pl.comp.lang.c Subject: Re: Działania na wielkich liczbach Date: Fri, 30 Sep 2016 23:49:05 +0200 Organization: ATMAN - ATM S.A. Lines: 84 Message-ID: <nsmmki$q6o$1@node1.news.atman.pl> References: <nsmfdj$hki$1@node1.news.atman.pl> NNTP-Posting-Host: 89-70-119-159.dynamic.chello.pl Mime-Version: 1.0 X-Trace: node1.news.atman.pl 1475272146 26840 89.70.119.159 (30 Sep 2016 21:49:06 GMT) X-Complaints-To: usenet@atman.pl NNTP-Posting-Date: Fri, 30 Sep 2016 21:49:06 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 In-Reply-To: <nsmfdj$hki$1@node1.news.atman.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit