🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #308804

Re: Działania na wielkich liczbach

#308804
From: bartekltg
Date: Fri, 30 Sep 2016 21:49
81 lines
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-mail
References: <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