Calculated pi with 487 billion digits by diskized GMP
American Citizen
website.reader3 at gmail.com
Sat Sep 2 05:17:42 CEST 2023
If someone wanted to do some useful work, calculating Viggo Brun's
constant to 100 places might be a good first step.
Brun's constant has to do with the sums of the reciprocals of twin
primes, such as 1/2 + 1/3 + 1/5 + 1/7 + 1/11 + 1/13 + 1/17 + 1/19 + etc
(where 1/2+1/3 is the exception of the twin primes be exactly 2 apart)
On 8/31/23 20:06, cents2823 at yahoo.co.jp wrote:
> * { font-size: 13px; font-family: 'MS Pゴシック', sans-serif;}p, ul, ol, blockquote { margin: 0;}a { color: #0064c8; text-decoration: none;}a:hover { color: #0057af; text-decoration: underline;}a:active { color: #004c98;}
> Hi,
>
>
>
>
> I am making a program to calculate pi with gmp and Chudnovsky Algorithm.
>
>
>
>
> If the number of digits to calculate pi increases,
>
>
>
>
> it takes using swap and takes a lot of time(*1) to calculate.
>
>
>
>
> So I diskized(*2) some functions of gmp and calculated pi 487 billion digits.
>
>
>
>
> It took about 10 days to calculate.
>
>
>
>
> I also calculated pi with y-cruncher and checked the result of a match.
>
>
>
>
> On the same PC, y-cruncher can calculate 1 trillion digits of pi in 32 hours.
>
>
>
>
> Why so fast!
>
>
>
>
> Thanks!
>
> Tsukamoto
>
>
>
>
>
>
>
> (*1)
>
>
>
>
> gmp and diskized large number multiplication time.
>
>
>
>
> Large number multiplication time is most of pi calculation time.
>
>
>
>
> large number digit(a,b) 2.5*10^10 5*10^10 10^11 2*10^11
>
>
>
>
> gmp a*b time(sec) 803 2,060 7,069 27,041
>
>
>
>
> diskized a*b time(sec) 469 1,014 2,302 5,052
>
>
>
>
> test pc:
>
>
>
>
> cpu: i9-7940X 14 core 28 threads
>
>
>
>
> memory: 128GB
>
>
>
>
> os: ubuntu 20.04.6 LTS
>
>
>
>
> gcc: 10.0.1
>
>
>
>
> gmp: 6.2.1
>
>
>
>
> nvme SSD 1TB x 8, 2TB x 1
>
>
>
>
>
>
> (*2)
>
>
>
>
> Diskized some gmp functions
>
>
>
>
> mpz_mul --> schon_mul: use Schonhage Strassen Algorithm
>
>
>
>
> and openmp parallel processing
>
>
>
>
> mpf_div --> recip: 1/b + schon_mul: (1/b)*a
>
>
>
>
> mpf_sqrt_ui --> sqrtr: sqrt(a) = (1/sqrt(a))*a
>
>
>
> mpz_add --> mpz_addf
>
>
>
>
> mpz_sub --> mpz_subf
>
>
>
>
>
>
>
> Change of disk-related gmp functions
>
>
>
>
> mpz_out_raw --> mpz_out_raw_p(*3: c sorce)
>
>
>
>
> mpz_inp_raw --> mpz_inp_raw_p(*4: c sorce)
>
>
>
>
>
>
>
> (*3)
>
>
>
>
> void mpz_out_raw_p(FILE **fp, mpz_t a)
>
>
>
>
> {
>
>
>
>
> // fp <-- a
>
>
>
>
> // disk output format is different from gmp
>
>
>
>
> // big endian --> little endian,
>
>
>
>
> // byte size(32bit) --> lim size(64bit)
>
>
>
>
>
>
>
> long int insizeb = a->_mp_size;
>
>
>
> long int insizea = labs(insizeb);
>
>
>
> if(fwrite(&insizeb, 8, 1, *fp) < 1){
>
>
>
> printf("\nFailed to write:mpz_out_raw_p\n");
>
>
>
> abort();
>
>
>
> }
>
>
>
> if(insizea > 0){
>
>
>
> if(fwrite(a->_mp_d, 8, insizea, *fp) < (unsigned long int)insizea){
>
>
>
> printf("\nFailed to write:mpz_out_raw_p\n");
>
>
>
> abort();
>
>
>
> }
>
>
>
> }
>
>
>
> }
>
>
>
>
>
>
>
> (*4)
>
>
>
>
> void mpz_inp_raw_p(mpz_t a, FILE **fp)
>
>
>
>
> {
>
>
>
>
> // a <-- fp
>
>
>
>
> //
>
>
>
>
>
>
>
> long int insizea, insizeb;
>
>
>
> fread(&insizeb, 8, 1, *fp);
>
>
>
> insizea = labs(insizeb);
>
>
>
> if(insizea > 0){
>
>
>
> mpz_set_ui(a, 1);
>
>
>
> mpz_mul_2exp(a, a, (insizea - 1) * 64);
>
>
>
> fread(a->_mp_d, 8, insizea, *fp);
>
>
>
> }
>
>
>
> a->_mp_size = insizeb;
>
>
>
> }
>
>
>
> _______________________________________________
> gmp-discuss mailing list
> gmp-discuss at gmplib.org
> https://gmplib.org/mailman/listinfo/gmp-discuss
More information about the gmp-discuss
mailing list