PTOQR - Primes To Quadruple Rows - szybki algorytm znajdowania liczb pierwszych.

sylvi91
Użytkownik
Użytkownik
Posty: 58
Rejestracja: 10 paź 2017, o 04:40
Płeć: Mężczyzna
wiek: 47
Lokalizacja: Łódź
Podziękował: 6 razy

PTOQR - Primes To Quadruple Rows - szybki algorytm znajdowania liczb pierwszych.

Post autor: sylvi91 »

Napisałem algorytm w języku C z wykorzystaniem std math library.

Jego założenie polega na wykorzystaniu powtarzalności cyfr w szeregach liczb pierwszych ułożonych czwórkami na każdy kolejny rząd dzisięciu liczb naturalnych.

Mamy liczby naturalne n i zwiększymy rzędy co 10 dodając kolejną czwórkę liczb z końcówkami 1,3,7,9.

QR => (n*10)+1,(n*10)+3,(n*10)+7,(n*10)+9
QR - quadruple row - rząd czwórki
n - liczba naturalna

Nie wiem jak to lepiej zapisać jako funkcję SIGMA w Lateksie. Może ktoś pomoże.

Oto kod źródłowy:

Kod: Zaznacz cały

// Calculate Primes set at given limit and show it as a sets of four in a row (n*10)+1,(n*10)+3,(n*10)+7,(n*10)+9
// 
// PTOQR - PRIME NUMBERS TO QUADRUPLE ROWS
// Author: MARTE.BEST - Sylwester Bogusiak aka Sylvi91 with use STD math library
// There is no warranty or guarantee of any kind.

// To Compile:
// gcc -o ptoqr ptoqr.c -lm

// Usage:
// ./ptoqr 1 1000

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>

#ifdef __APPLE__

#include <mach/mach_time.h>

#else

#include <time.h>

#endif




////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///                                                 IS THIS PRIME NUMBER - CLASSICAL VERSION

int is_this_prime_number(int natural_number)
{


int n, i, flag = 0;

    n=natural_number;

    for(i=2; i<=n/2; ++i)
    {
        // condition for nonprime number
        if(n%i==0)
        {
            flag=1;
            break;
        }
    }

    if (flag==0)
        return 0;           // 0 - jest prime
    else
        return 1;

    }



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///                                                 IS THIS PRIME NUMBER 3-7 FOR 1379 METHOD AKA PTOQR


int is_this_prime_number_3_7(unsigned long long int natural_number)
{


unsigned long long int i, n, flag = 0;

        n=natural_number;

   
        // condition for nonprime number
        
        if((n%3==0) || (n%7==0))
        {
            flag=1; // 1 - nonprime
            return 1; 
        }
  
            for(i=11; i<=sqrt(n); i=i+2)
    {
        // condition for nonprime number
        if(n%i==0)
        {
            flag=1;
            break;
        }
    }

    if (flag==0)
        return 0;           // 0 - is prime
    else
        return 1;


}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///  CALCULATE AND DISPLAY PRIMES

int calc_primes_1379(unsigned long long int begin, unsigned long long int end)
{


unsigned long long int i,n; 


unsigned long long int a;
unsigned long long int row_sum=0; // sum of prime numbers in a row
unsigned long long int row_qty=0; // qty of prime numbers in a row
unsigned long long int total_qty=0; // total qty of prime numbers
      
        
int four[4] = {1,3,7,9};


if ((end>=begin) && (begin>=1))


{




printf("________________________________________________________________________\n");
printf("______________________ PTO1379 aka PTOQR v.0.1 BETA ____________________\n");
printf("____________________ PRIME NUMBERS TO QUADRUPLE ROWS ___________________\n");

printf("____________ THAT APP IS CALCULATING THE PRIME NUMBERS _________________\n");

printf("_____ AND DISPLAYS IT AS 4 COLUMNS OF INTEGERS ENDED WITH 1,3,7,9 ______\n");

printf("____________ Author: MARTE.BEST - Sylwester B aka Sylvi91 ______________\n");

printf("________________________________________________________________________\n");

printf("_______________          Please wait. Warning!           _______________\n");
printf("__ For end limit greater than 100000000 this may take couple minutes. __\n");

printf("_______________ Bigger limit consume more and more time. _______________\n");
printf("________________________________________________________________________\n");




//print on screen
printf("* - PRIME, n - natural number\n ");
printf("       integers          sum  qty\n ");

if (begin == 1) 
{
printf("     *2,*3,*5,*7,        17   4,\n ");
total_qty = 4;
}



for (n = begin; n < end; n ++) 

{

row_sum=0;
row_qty=0;

for (i = 0; i < 4; i ++) 

{
a = (n * 10) + four[i];

        
        if (!is_this_prime_number_3_7(a)) // faster over 100 to 1000 times
        
       // if (!is_this_prime_number(a))     // very slow
{
row_sum += a; row_qty++;
printf(" *%llu, ", a);
total_qty++;
//printf("*");
} 
else
{
printf(" n%llu, ", a);
//printf(" ");
}

    
        
}

printf(" %llu, ", row_sum); 
printf(" %llu, ", row_qty);
printf("\n ");

}


printf(" Total primes quantity between %llu and %llu is equal to: %llu ", begin, end * 10, total_qty);
printf("\n ");


}
        else
                
        {
           printf("Set properly begin and end of rows\n ");     
        }


return 0;

}




int main(int argc, char * argv[]) {

 


    	unsigned long long int b;
        unsigned long long int e;
        
      	if (argc <= 2)
      	{

        printf ("Usage: %s <begin of rows> <end of rows>\n", argv[0]);

        return 1;

      	}


        b=atol(argv[1]);
        e=atol(argv[2]);
        
      	assert(b >= 1);
        assert(e >= 2);
        
        
 	// Get system time START

      	#ifdef __APPLE__

        uint64_t start = mach_absolute_time();

    	#else

        clock_t start = clock();

    	#endif

 

        calc_primes_1379(b,e);  // Change the arguments b and e to adjust the begin and end of rows [1,3,7,9]

    
 	// Get system time END

    	#ifdef __APPLE__

        uint64_t end = mach_absolute_time();

        mach_timebase_info_data_t timebase_info;

        mach_timebase_info(&timebase_info);

        long double diff = (end - start) * timebase_info.numer / timebase_info.denom; // nano sec

    
        printf("Your calculations took %.3Lf seconds to run.\n", diff / 1e9 );

    	#else

        clock_t end = clock();

        printf("Your calculations took %.3Lf seconds to run.\n", (long double)(end - start) / CLOCKS_PER_SEC );

    	#endif


    	return 0;

}



Przykładowy wynik:

Kod: Zaznacz cały

________________________________________________________________________
______________________ PTO1379 aka PTOQR v.0.1 BETA ____________________
____________________ PRIME NUMBERS TO QUADRUPLE ROWS ___________________
____________ THAT APP IS CALCULATING THE PRIME NUMBERS _________________
_____ AND DISPLAYS IT AS 4 COLUMNS OF INTEGERS ENDED WITH 1,3,7,9 ______
____________ Author: MARTE.BEST - Sylwester B aka Sylvi91 ______________
________________________________________________________________________
_______________          Please wait. Warning!           _______________
__ For end limit greater than 100000000 this may take couple minutes. __
_______________ Bigger limit consume more and more time. _______________
________________________________________________________________________
* - PRIME, n - natural number
        integers          sum  qty
      *2,*3,*5,*7,        17   4,
  *11,  *13,  *17,  *19,  60,  4, 
  n21,  *23,  n27,  *29,  52,  2, 
  *31,  n33,  *37,  n39,  68,  2, 
  *41,  *43,  *47,  n49,  131,  3, 
  n51,  *53,  n57,  *59,  112,  2, 
  *61,  n63,  *67,  n69,  128,  2, 
  *71,  *73,  n77,  *79,  223,  3, 
  n81,  *83,  n87,  *89,  172,  2, 
  n91,  n93,  *97,  n99,  97,  1, 
  *101,  *103,  *107,  *109,  420,  4, 
  n111,  *113,  n117,  n119,  113,  1, 
  n121,  n123,  *127,  n129,  127,  1, 
  *131,  n133,  *137,  *139,  407,  3, 
  n141,  n143,  n147,  *149,  149,  1, 
  *151,  n153,  *157,  n159,  308,  2, 
  n161,  *163,  *167,  n169,  330,  2, 
  n171,  *173,  n177,  *179,  352,  2, 
  *181,  n183,  n187,  n189,  181,  1, 
  *191,  *193,  *197,  *199,  780,  4, 
  n201,  n203,  n207,  n209,  0,  0, 
  *211,  n213,  n217,  n219,  211,  1, 
  n221,  *223,  *227,  *229,  679,  3, 
  n231,  *233,  n237,  *239,  472,  2, 
  *241,  n243,  n247,  n249,  241,  1, 
  *251,  n253,  *257,  n259,  508,  2, 
  n261,  *263,  n267,  *269,  532,  2, 
  *271,  n273,  *277,  n279,  548,  2, 
  *281,  *283,  n287,  n289,  564,  2, 
  n291,  *293,  n297,  n299,  293,  1, 
  n301,  n303,  *307,  n309,  307,  1, 
  *311,  *313,  *317,  n319,  941,  3, 
  n321,  n323,  n327,  n329,  0,  0, 
  *331,  n333,  *337,  n339,  668,  2, 
  n341,  n343,  *347,  *349,  696,  2, 
  n351,  *353,  n357,  *359,  712,  2, 
  n361,  n363,  *367,  n369,  367,  1, 
  n371,  *373,  n377,  *379,  752,  2, 
  n381,  *383,  n387,  *389,  772,  2, 
  n391,  n393,  *397,  n399,  397,  1, 
  *401,  n403,  n407,  *409,  810,  2, 
  n411,  n413,  n417,  *419,  419,  1, 
  *421,  n423,  n427,  n429,  421,  1, 
  *431,  *433,  n437,  *439,  1303,  3, 
  n441,  *443,  n447,  *449,  892,  2, 
  n451,  n453,  *457,  n459,  457,  1, 
  *461,  *463,  *467,  n469,  1391,  3, 
  n471,  n473,  n477,  *479,  479,  1, 
  n481,  n483,  *487,  n489,  487,  1, 
  *491,  n493,  n497,  *499,  990,  2, 
  n501,  *503,  n507,  *509,  1012,  2, 
  n511,  n513,  n517,  n519,  0,  0, 
  *521,  *523,  n527,  n529,  1044,  2, 
  n531,  n533,  n537,  n539,  0,  0, 
  *541,  n543,  *547,  n549,  1088,  2, 
  n551,  n553,  *557,  n559,  557,  1, 
  n561,  *563,  n567,  *569,  1132,  2, 
  *571,  n573,  *577,  n579,  1148,  2, 
  n581,  n583,  *587,  n589,  587,  1, 
  n591,  *593,  n597,  *599,  1192,  2, 
  *601,  n603,  *607,  n609,  1208,  2, 
  n611,  *613,  *617,  *619,  1849,  3, 
  n621,  n623,  n627,  n629,  0,  0, 
  *631,  n633,  n637,  n639,  631,  1, 
  *641,  *643,  *647,  n649,  1931,  3, 
  n651,  *653,  n657,  *659,  1312,  2, 
  *661,  n663,  n667,  n669,  661,  1, 
  n671,  *673,  *677,  n679,  1350,  2, 
  n681,  *683,  n687,  n689,  683,  1, 
  *691,  n693,  n697,  n699,  691,  1, 
  *701,  n703,  n707,  *709,  1410,  2, 
  n711,  n713,  n717,  *719,  719,  1, 
  n721,  n723,  *727,  n729,  727,  1, 
  n731,  *733,  n737,  *739,  1472,  2, 
  n741,  *743,  n747,  n749,  743,  1, 
  *751,  n753,  *757,  n759,  1508,  2, 
  *761,  n763,  n767,  *769,  1530,  2, 
  n771,  *773,  n777,  n779,  773,  1, 
  n781,  n783,  *787,  n789,  787,  1, 
  n791,  n793,  *797,  n799,  797,  1, 
  n801,  n803,  n807,  *809,  809,  1, 
  *811,  n813,  n817,  n819,  811,  1, 
  *821,  *823,  *827,  *829,  3300,  4, 
  n831,  n833,  n837,  *839,  839,  1, 
  n841,  n843,  n847,  n849,  0,  0, 
  n851,  *853,  *857,  *859,  2569,  3, 
  n861,  *863,  n867,  n869,  863,  1, 
  n871,  n873,  *877,  n879,  877,  1, 
  *881,  *883,  *887,  n889,  2651,  3, 
  n891,  n893,  n897,  n899,  0,  0, 
  n901,  n903,  *907,  n909,  907,  1, 
  *911,  n913,  n917,  *919,  1830,  2, 
  n921,  n923,  n927,  *929,  929,  1, 
  n931,  n933,  *937,  n939,  937,  1, 
  *941,  n943,  *947,  n949,  1888,  2, 
  n951,  *953,  n957,  n959,  953,  1, 
  n961,  n963,  *967,  n969,  967,  1, 
  *971,  n973,  *977,  n979,  1948,  2, 
  n981,  *983,  n987,  n989,  983,  1, 
  *991,  n993,  *997,  n999,  1988,  2, 
  Total primes quantity between 1 and 1000 is equal to: 168 
 Your calculations took 0.000 seconds to run.

Warto potestować. Wystarczy zmienić jedną linijkę i można porównać prędkość z klasyczną wersją algorytmu, który jest w funkcji wyżej.
Jeszcze nie robiłem testów porównawczych co do szybkości z sitem Eratotenesa, ale mam zamiar.
Na moim PC AMD Ryzen 5 3600 6-Core Processor liczby pierwsze z przedziału 1 do 10 000 000 zlicza w czasie 4.6 sekundy.
Oto końcówka wyników:

Kod: Zaznacz cały

  n9999711,  *9999713,  n9999717,  n9999719,  9999713,  1, 
  n9999721,  n9999723,  n9999727,  n9999729,  0,  0, 
  n9999731,  n9999733,  n9999737,  *9999739,  9999739,  1, 
  n9999741,  n9999743,  n9999747,  *9999749,  9999749,  1, 
  n9999751,  n9999753,  n9999757,  n9999759,  0,  0, 
  *9999761,  n9999763,  n9999767,  n9999769,  9999761,  1, 
  n9999771,  n9999773,  n9999777,  n9999779,  0,  0, 
  n9999781,  n9999783,  n9999787,  n9999789,  0,  0, 
  n9999791,  n9999793,  n9999797,  n9999799,  0,  0, 
  n9999801,  n9999803,  n9999807,  n9999809,  0,  0, 
  n9999811,  n9999813,  n9999817,  n9999819,  0,  0, 
  n9999821,  *9999823,  n9999827,  n9999829,  9999823,  1, 
  n9999831,  n9999833,  n9999837,  n9999839,  0,  0, 
  n9999841,  n9999843,  n9999847,  n9999849,  0,  0, 
  n9999851,  n9999853,  n9999857,  n9999859,  0,  0, 
  n9999861,  *9999863,  n9999867,  n9999869,  9999863,  1, 
  n9999871,  n9999873,  *9999877,  n9999879,  9999877,  1, 
  n9999881,  *9999883,  n9999887,  *9999889,  19999772,  2, 
  n9999891,  n9999893,  n9999897,  n9999899,  0,  0, 
  *9999901,  n9999903,  *9999907,  n9999909,  19999808,  2, 
  n9999911,  n9999913,  n9999917,  n9999919,  0,  0, 
  n9999921,  n9999923,  n9999927,  *9999929,  9999929,  1, 
  *9999931,  n9999933,  *9999937,  n9999939,  19999868,  2, 
  n9999941,  *9999943,  n9999947,  n9999949,  9999943,  1, 
  n9999951,  n9999953,  n9999957,  n9999959,  0,  0, 
  n9999961,  n9999963,  n9999967,  n9999969,  0,  0, 
  *9999971,  *9999973,  n9999977,  n9999979,  19999944,  2, 
  n9999981,  n9999983,  n9999987,  n9999989,  0,  0, 
  *9999991,  n9999993,  n9999997,  n9999999,  9999991,  1, 
  Total primes quantity between 1 and 10000000 is equal to: 664579: 
 Your calculations took 4.603 seconds to run.

W sposób klasyczny z funkcją is_this_prime_number() liczył wynik dla tego przedziału do 10 000 000 przez ponad 5748 sekund.

To na wstępie wszystko.
Co sądzicie o tym algorytmie?
Dzięĸuję.
sylvi91
Użytkownik
Użytkownik
Posty: 58
Rejestracja: 10 paź 2017, o 04:40
Płeć: Mężczyzna
wiek: 47
Lokalizacja: Łódź
Podziękował: 6 razy

Re: PTOQR - Primes To Quadruple Rows - szybki algorytm znajdowania liczb pierwszych.

Post autor: sylvi91 »

Minęło parę dni, a ja międzyczasie napisałem rozszerzoną wersję tego algorytmu z wykorzystaniem biblioteki MPFR.
Oto kod źródłowy:

Kod: Zaznacz cały

// Calculate Primes set at given limit and show it as a sets of four in a row (n*10)+1,(n*10)+3,(n*10)+7,(n*10)+9
// 
// PTOQRL - PRIME NUMBERS TO QUADRUPLE ROWS LONG
// Author: MARTE.BEST - Sylwester Bogusiak aka Sylvi91
// This is free code to calculate Prime numbers with use MPFR library
// There is no warranty or guarantee of any kind.

// To Compile:
// gcc -o ptoqrl ptoqrl.c -lm -lmpfr

// Usage:
// ./ptoqrl 100 100

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>

#include <mpfr.h>


#ifdef __APPLE__

#include <mach/mach_time.h>

#else

#include <time.h>

#endif


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///                                                 IS THIS PRIME NUMBER - CLASSICAL VERSION

int is_this_prime_number(int natural_number)
{


int n, i, flag = 0;

    n=natural_number;

    for(i=2; i<=n/2; ++i)
    {
        // condition for nonprime number
        if(n%i==0)
        {
            flag=1;
            break;
        }
    }

    if (flag==0)
        return 0;           // 0 - jest prime
    else
        return 1;


    //return 0;
    }





////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///                                                 IS THIS PRIME NUMBER 3-7 FOR 1379 METHOD STD MATH


int is_this_prime_number_3_7(unsigned long long int natural_number)
{


unsigned long long int i, n, flag = 0;

        n=natural_number;

   
        // condition for nonprime number
        
        if((n%3==0) || (n%7==0))
        {
            flag=1; // 1 - nonprime
            return 1; 
        }
  
            for(i=11; i<=sqrt(n); i=i+2)
    {
        // condition for nonprime number
        if(n%i==0)
        {
            flag=1;
            break;
        }
    }

    if (flag==0)
        return 0;           // 0 - is prime
    else
        return 1;


}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///                                                 IS THIS PRIME NUMBER 3-7 FOR 1379 METHOD MPFR VERSION


int is_this_prime_number_3_7_mpfr(mpfr_t natural_number)
{


	mpfr_t r, i, n, one, three, seven, eleven, temp, sqrt_n; 

	int flag = 0;
	int decimals = 100;
	
	mpfr_inits2(decimals, one, three, seven, eleven, temp, sqrt_n, i, n, NULL);
	mpfr_set_ui(one,1, MPFR_RNDN);
	mpfr_set_ui(three,3, MPFR_RNDN);
	mpfr_set_ui(seven,7, MPFR_RNDN);
    	mpfr_set_ui(eleven,11, MPFR_RNDN);
       // n=natural_number;

   
        // conditions for nonprime number
        
    
	mpfr_fmod(three ,natural_number, three, MPFR_RNDN); 
	
	mpfr_fmod(seven ,natural_number, seven, MPFR_RNDN); 
	
	
	if((mpfr_cmpabs_ui(three,0)==0) || (mpfr_cmpabs_ui(seven,0)==0))
	
	
	
	
        {
            flag=1; // 1 - nonprime
            return 1; 
        }
  
	
    
  
    
    	mpfr_sqrt(sqrt_n, natural_number, MPFR_RNDN);
    
        
    	while(mpfr_cmpabs(eleven, sqrt_n) <= 0)
    	{
        	
        mpfr_fmod(temp, natural_number, eleven, MPFR_RNDN); 
	
	
	if((mpfr_cmpabs_ui(temp,0)==0))
	
    	{
            flag=1; // 1 - nonprime
        
        return 1;
        
           break; 
       // break;
        
        
    	}
        
        mpfr_add_si(eleven, eleven, 2, MPFR_RNDN);
        
    
    	}
    
    

    
    
    	mpfr_clears(one, three, seven, eleven, temp, sqrt_n, i, n, NULL);
    	if (flag==0)
        return 0;           // 0 - is prime
    	else
        return 1;

	
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///  CALCULATE AND DISPLAY PRIMES LONG VERSION

int calc_primes_1379_mpfr(char *b, char *e)
{


	int decimals;
	decimals = 100; 
	mpfr_t n, a, begin, end, row_sum, total_qty;
	
	mpfr_inits2(decimals, n, a, begin, end, row_sum, total_qty, NULL);
	
	
	
        
int four[4] = {1,3,7,9};
int i, row_qty;
	
	
mpfr_set_str(begin, b, 10, MPFR_RNDN);  // init of the loop begin
mpfr_set_str(end, e, 10, MPFR_RNDN);  // init of the loop end

mpfr_pow_ui(begin, begin, 3, MPFR_RNDN);  // Attention!!! power of 3
mpfr_add(end, begin, end, MPFR_RNDN);     // number of rows
	
mpfr_set_ui(total_qty, 0, MPFR_RNDN);
mpfr_set_ui(row_sum, 0, MPFR_RNDN);	
//mpfr_set_ui(a, 1, MPFR_RNDN);	

if (mpfr_cmpabs(end,begin) >0)


{




mpfr_printf("________________________________________________________________________\n");
mpfr_printf("____________________ PTO1379L aka PTOQRL v.0.2 BETA ____________________\n");
mpfr_printf("_____________ PRIME NUMBERS TO QUADRUPLE ROWS LONG VERSION _____________\n");

mpfr_printf("____________ THAT APP IS CALCULATING THE PRIME NUMBERS _________________\n");

mpfr_printf("_____ AND DISPLAYS IT AS 4 COLUMNS OF INTEGERS ENDED WITH 1,3,7,9 ______\n");

mpfr_printf("____________ Author: MARTE.BEST - Sylwester B aka Sylvi91 ______________\n");

mpfr_printf("________________________________________________________________________\n");

mpfr_printf("_______________          Please wait. Warning!           _______________\n");
mpfr_printf("__ For end limit greater than 100000000 this may take couple minutes. __\n");

mpfr_printf("_______________ Bigger limit consume more and more time. _______________\n");
mpfr_printf("________________________________________________________________________\n");




//print on screen
mpfr_printf("* - PRIME, n - natural number\n ");
mpfr_printf("       integers          sum  qty\n ");

	
	
	
if (mpfr_cmpabs_ui(begin,1) == 0)
{
mpfr_printf("     *2,*3,*5,*7,        17   4,\n ");

		mpfr_set_ui(total_qty, 4, MPFR_RNDN);  // 4
}

mpfr_set(n, begin, MPFR_RNDN);


while(mpfr_cmpabs(n, end) < 0)
{

   
mpfr_set_ui(row_sum, 0, MPFR_RNDN);

row_qty=0;

for (i = 0; i < 4; i ++) 

{

mpfr_mul_ui(a,n,10,MPFR_RNDN);
mpfr_add_si(a,a,four[i], MPFR_RNDN);
    
  
		
if (!is_this_prime_number_3_7_mpfr(a))
{


mpfr_add(row_sum, row_sum, a, MPFR_RNDN);
row_qty++;
mpfr_add_si(total_qty, total_qty, 1, MPFR_RNDN);
mpfr_printf(" *%.0RNf, ", a);
	   

} 
else
{

mpfr_printf(" n%.0RNf, ", a);

}

    
        
}

    
    mpfr_printf(" %.0RNf, ", row_sum);
    mpfr_printf(" %d, ", row_qty);
    mpfr_printf("\n ");
	

    mpfr_add_si(n, n, 1, MPFR_RNDN); // increment n for while loop
 
}

///mpfr_mul_ui(end,end,10,MPFR_RNDN);   // 10 times integers than rows
mpfr_printf(" Total primes quantity between %.0RNf and %.0RNf rows is equal to: %.0RNf ", begin, end, total_qty);
printf("\n ");


}
        else
                
        {
           printf("Set properly begin and end of rows\n ");     
        }

mpfr_clears(n, a, begin, end, row_sum, total_qty, NULL);
    
    
	
return 0;

}




int main(int argc, char * argv[]) {

 

		//unsigned long long int d; 	// decimals
    	char * b;   				// begin
        char * e;					// end
        
      	if (argc <= 2)
      	{

        printf ("Usage: %s <begin of rows(Attention!!! To the power of 3!)> <number of rows>\n", argv[0]);

        return 1;

      	}


        b=argv[1];
        e=argv[2];
        
      	assert(b != NULL);
        assert(e != NULL);
        
		//d = atol(argv[3]);
		//assert (d>=1);
	
        
 	// Get system time START

      	#ifdef __APPLE__

        uint64_t start = mach_absolute_time();

    	#else

        clock_t start = clock();

    	#endif

 

        calc_primes_1379_mpfr(b,e);  // Change the arguments b and e to adjust the begin and end of rows [1,3,7,9]

    
 	// Get system time END

    	#ifdef __APPLE__

        uint64_t end = mach_absolute_time();

        mach_timebase_info_data_t timebase_info;

        mach_timebase_info(&timebase_info);

        long double diff = (end - start) * timebase_info.numer / timebase_info.denom; // nano sec

    
        printf("Your calculations took %.3Lf seconds to run.\n", diff / 1e9 );

    	#else

        clock_t end = clock();

        printf("Your calculations took %.3Lf seconds to run.\n", (long double)(end - start) / CLOCKS_PER_SEC );

    	#endif
        
        mpfr_free_cache();
    	return 0;

}

Obecnie robię poszukiwania liczby pierwszych przy pomocy tego algorytmu. Jest zdecydowanie wolniejszy niż Sito Eratostenesa, ale nie potrzebuje tyle pamięci operacyjnej bo nie tworzy tak dużej tablicy liczb pierwszych: array() a jedynie malutką tablicę z 4 cyframi: 1,3,7,9.

Dotychczas największa liczba pierwszą jaką znalazłem to: 8272402618863367641817 niestety nie wiem jak potwierdzić czy to na pewno liczba pierwsza. Google milczy w tej sprawie.
Próbowałem odpalić Sito Eratostenesa ale dla takich dużych (10^21) liczb cała tablica liczb pierwszych mi się nie zmieści w pamięci operacyjnej 64 GB, a jeszcze nie próbowałem stronicować tablicy. W zwykłym ale zoptymalizowanym sicie nie mieści mi się nawet tablica z zakresu 10^12, a 10^11 po minucie zajmuje już prawie 20% dostępnej pamięci RAM.
OK. Na razie nie wiem jak będę potwierdzał kolejne wyniki, bo algorytm jest obiecujący i napewno porobię jeszcze sporo obliczeń.

Oto kilka wyników z tego programu PTOQRL.
Warto potestować. Jako pierwszy parametr jest początkowy rząd, przy czym wprowadzona wartość jest podnoszona do 3 potęgi,. Natomiast drugi parametr to długość listy, czyli rzędów czwórek. ... bo lecimi dziesiątkami i wybieramy tylko liczby kończące się na 1,3,7,9.

Kod: Zaznacz cały

________________________________________________________________________
____________________ PTO1379L aka PTOQRL v.0.2 BETA ____________________
_____________ PRIME NUMBERS TO QUADRUPLE ROWS LONG VERSION _____________
____________ THAT APP IS CALCULATING THE PRIME NUMBERS _________________
_____ AND DISPLAYS IT AS 4 COLUMNS OF INTEGERS ENDED WITH 1,3,7,9 ______
____________ Author: MARTE.BEST - Sylwester B aka Sylvi91 ______________
________________________________________________________________________
_______________          Please wait. Warning!           _______________
__ For end limit greater than 100000000 this may take couple minutes. __
_______________ Bigger limit consume more and more time. _______________
________________________________________________________________________
* - PRIME, n - natural number
        integers          sum  qty
  n10000000000000000001,  n10000000000000000003,  n10000000000000000007,  n10000000000000000009,  0,  0, 
  n10000000000000000011,  n10000000000000000013,  n10000000000000000017,  n10000000000000000019,  0,  0, 
  n10000000000000000021,  n10000000000000000023,  n10000000000000000027,  n10000000000000000029,  0,  0, 
  n10000000000000000031,  n10000000000000000033,  n10000000000000000037,  n10000000000000000039,  0,  0, 
  n10000000000000000041,  n10000000000000000043,  n10000000000000000047,  n10000000000000000049,  0,  0, 
  *10000000000000000051,  n10000000000000000053,  n10000000000000000057,  n10000000000000000059,  10000000000000000051,  1, 
  n10000000000000000061,  n10000000000000000063,  n10000000000000000067,  n10000000000000000069,  0,  0, 
  n10000000000000000071,  n10000000000000000073,  n10000000000000000077,  n10000000000000000079,  0,  0, 
  n10000000000000000081,  n10000000000000000083,  *10000000000000000087,  n10000000000000000089,  10000000000000000087,  1, 
  *10000000000000000091,  n10000000000000000093,  *10000000000000000097,  *10000000000000000099,  30000000000000000287,  3, 
  n10000000000000000101,  n10000000000000000103,  n10000000000000000107,  n10000000000000000109,  0,  0, 
  n10000000000000000111,  n10000000000000000113,  n10000000000000000117,  n10000000000000000119,  0,  0, 
  n10000000000000000121,  n10000000000000000123,  n10000000000000000127,  n10000000000000000129,  0,  0, 
  n10000000000000000131,  n10000000000000000133,  n10000000000000000137,  n10000000000000000139,  0,  0, 
  n10000000000000000141,  n10000000000000000143,  *10000000000000000147,  n10000000000000000149,  10000000000000000147,  1, 
  n10000000000000000151,  n10000000000000000153,  n10000000000000000157,  n10000000000000000159,  0,  0, 
  n10000000000000000161,  n10000000000000000163,  n10000000000000000167,  *10000000000000000169,  10000000000000000169,  1, 
  n10000000000000000171,  n10000000000000000173,  n10000000000000000177,  n10000000000000000179,  0,  0, 
  n10000000000000000181,  n10000000000000000183,  n10000000000000000187,  n10000000000000000189,  0,  0, 
  n10000000000000000191,  n10000000000000000193,  n10000000000000000197,  n10000000000000000199,  0,  0, 
  n10000000000000000201,  n10000000000000000203,  n10000000000000000207,  n10000000000000000209,  0,  0, 
  n10000000000000000211,  n10000000000000000213,  n10000000000000000217,  n10000000000000000219,  0,  0, 
  n10000000000000000221,  n10000000000000000223,  n10000000000000000227,  n10000000000000000229,  0,  0, 
  n10000000000000000231,  n10000000000000000233,  n10000000000000000237,  n10000000000000000239,  0,  0, 
  n10000000000000000241,  n10000000000000000243,  n10000000000000000247,  n10000000000000000249,  0,  0, 
  n10000000000000000251,  n10000000000000000253,  n10000000000000000257,  n10000000000000000259,  0,  0, 
  n10000000000000000261,  n10000000000000000263,  n10000000000000000267,  n10000000000000000269,  0,  0, 
  n10000000000000000271,  *10000000000000000273,  n10000000000000000277,  n10000000000000000279,  10000000000000000273,  1, 
  n10000000000000000281,  n10000000000000000283,  n10000000000000000287,  n10000000000000000289,  0,  0, 
  n10000000000000000291,  n10000000000000000293,  *10000000000000000297,  n10000000000000000299,  10000000000000000297,  1, 
  n10000000000000000301,  n10000000000000000303,  *10000000000000000307,  n10000000000000000309,  10000000000000000307,  1, 
  n10000000000000000311,  n10000000000000000313,  n10000000000000000317,  n10000000000000000319,  0,  0, 
  n10000000000000000321,  n10000000000000000323,  n10000000000000000327,  n10000000000000000329,  0,  0, 
  n10000000000000000331,  n10000000000000000333,  n10000000000000000337,  n10000000000000000339,  0,  0, 
  n10000000000000000341,  n10000000000000000343,  n10000000000000000347,  n10000000000000000349,  0,  0, 
  n10000000000000000351,  n10000000000000000353,  n10000000000000000357,  n10000000000000000359,  0,  0, 
  n10000000000000000361,  n10000000000000000363,  n10000000000000000367,  n10000000000000000369,  0,  0, 
  n10000000000000000371,  n10000000000000000373,  n10000000000000000377,  n10000000000000000379,  0,  0, 
  *10000000000000000381,  n10000000000000000383,  n10000000000000000387,  n10000000000000000389,  10000000000000000381,  1, 
  *10000000000000000391,  n10000000000000000393,  n10000000000000000397,  n10000000000000000399,  10000000000000000391,  1, 
  n10000000000000000401,  n10000000000000000403,  n10000000000000000407,  n10000000000000000409,  0,  0, 
  n10000000000000000411,  n10000000000000000413,  n10000000000000000417,  n10000000000000000419,  0,  0, 
  n10000000000000000421,  *10000000000000000423,  n10000000000000000427,  n10000000000000000429,  10000000000000000423,  1, 
  n10000000000000000431,  n10000000000000000433,  n10000000000000000437,  n10000000000000000439,  0,  0, 
  n10000000000000000441,  n10000000000000000443,  n10000000000000000447,  n10000000000000000449,  0,  0, 
  n10000000000000000451,  n10000000000000000453,  n10000000000000000457,  n10000000000000000459,  0,  0, 
  n10000000000000000461,  n10000000000000000463,  n10000000000000000467,  n10000000000000000469,  0,  0, 
  n10000000000000000471,  n10000000000000000473,  n10000000000000000477,  n10000000000000000479,  0,  0, 
  n10000000000000000481,  *10000000000000000483,  n10000000000000000487,  *10000000000000000489,  20000000000000000972,  2, 
  n10000000000000000491,  n10000000000000000493,  n10000000000000000497,  n10000000000000000499,  0,  0, 
  n10000000000000000501,  n10000000000000000503,  n10000000000000000507,  n10000000000000000509,  0,  0, 
  n10000000000000000511,  n10000000000000000513,  n10000000000000000517,  n10000000000000000519,  0,  0, 
  n10000000000000000521,  n10000000000000000523,  n10000000000000000527,  n10000000000000000529,  0,  0, 
  n10000000000000000531,  n10000000000000000533,  n10000000000000000537,  n10000000000000000539,  0,  0, 
  n10000000000000000541,  n10000000000000000543,  n10000000000000000547,  n10000000000000000549,  0,  0, 
  n10000000000000000551,  *10000000000000000553,  n10000000000000000557,  n10000000000000000559,  10000000000000000553,  1, 
  n10000000000000000561,  n10000000000000000563,  n10000000000000000567,  n10000000000000000569,  0,  0, 
  n10000000000000000571,  n10000000000000000573,  n10000000000000000577,  n10000000000000000579,  0,  0, 
  n10000000000000000581,  n10000000000000000583,  n10000000000000000587,  *10000000000000000589,  10000000000000000589,  1, 
  n10000000000000000591,  n10000000000000000593,  n10000000000000000597,  n10000000000000000599,  0,  0, 
  n10000000000000000601,  *10000000000000000603,  n10000000000000000607,  n10000000000000000609,  10000000000000000603,  1, 
  n10000000000000000611,  n10000000000000000613,  n10000000000000000617,  n10000000000000000619,  0,  0, 
  n10000000000000000621,  n10000000000000000623,  n10000000000000000627,  n10000000000000000629,  0,  0, 
  *10000000000000000631,  n10000000000000000633,  n10000000000000000637,  n10000000000000000639,  10000000000000000631,  1, 
  n10000000000000000641,  n10000000000000000643,  n10000000000000000647,  n10000000000000000649,  0,  0, 
  n10000000000000000651,  n10000000000000000653,  n10000000000000000657,  n10000000000000000659,  0,  0, 
  n10000000000000000661,  n10000000000000000663,  *10000000000000000667,  n10000000000000000669,  10000000000000000667,  1, 
  n10000000000000000671,  n10000000000000000673,  n10000000000000000677,  n10000000000000000679,  0,  0, 
  n10000000000000000681,  n10000000000000000683,  n10000000000000000687,  n10000000000000000689,  0,  0, 
  n10000000000000000691,  n10000000000000000693,  n10000000000000000697,  *10000000000000000699,  10000000000000000699,  1, 
  n10000000000000000701,  n10000000000000000703,  n10000000000000000707,  n10000000000000000709,  0,  0, 
  n10000000000000000711,  n10000000000000000713,  n10000000000000000717,  n10000000000000000719,  0,  0, 
  *10000000000000000721,  n10000000000000000723,  n10000000000000000727,  n10000000000000000729,  10000000000000000721,  1, 
  n10000000000000000731,  n10000000000000000733,  n10000000000000000737,  n10000000000000000739,  0,  0, 
  *10000000000000000741,  n10000000000000000743,  n10000000000000000747,  n10000000000000000749,  10000000000000000741,  1, 
  n10000000000000000751,  n10000000000000000753,  n10000000000000000757,  n10000000000000000759,  0,  0, 
  n10000000000000000761,  *10000000000000000763,  n10000000000000000767,  n10000000000000000769,  10000000000000000763,  1, 
  n10000000000000000771,  n10000000000000000773,  n10000000000000000777,  n10000000000000000779,  0,  0, 
  n10000000000000000781,  n10000000000000000783,  *10000000000000000787,  n10000000000000000789,  10000000000000000787,  1, 
  n10000000000000000791,  n10000000000000000793,  n10000000000000000797,  n10000000000000000799,  0,  0, 
  n10000000000000000801,  n10000000000000000803,  n10000000000000000807,  n10000000000000000809,  0,  0, 
  n10000000000000000811,  n10000000000000000813,  n10000000000000000817,  n10000000000000000819,  0,  0, 
  n10000000000000000821,  n10000000000000000823,  n10000000000000000827,  n10000000000000000829,  0,  0, 
  n10000000000000000831,  n10000000000000000833,  n10000000000000000837,  n10000000000000000839,  0,  0, 
  n10000000000000000841,  n10000000000000000843,  n10000000000000000847,  n10000000000000000849,  0,  0, 
  n10000000000000000851,  n10000000000000000853,  n10000000000000000857,  n10000000000000000859,  0,  0, 
  n10000000000000000861,  n10000000000000000863,  n10000000000000000867,  n10000000000000000869,  0,  0, 
  n10000000000000000871,  n10000000000000000873,  n10000000000000000877,  n10000000000000000879,  0,  0, 
  n10000000000000000881,  n10000000000000000883,  n10000000000000000887,  n10000000000000000889,  0,  0, 
  *10000000000000000891,  n10000000000000000893,  n10000000000000000897,  n10000000000000000899,  10000000000000000891,  1, 
  n10000000000000000901,  n10000000000000000903,  n10000000000000000907,  n10000000000000000909,  0,  0, 
  n10000000000000000911,  n10000000000000000913,  n10000000000000000917,  n10000000000000000919,  0,  0, 
  n10000000000000000921,  n10000000000000000923,  n10000000000000000927,  n10000000000000000929,  0,  0, 
  n10000000000000000931,  n10000000000000000933,  n10000000000000000937,  n10000000000000000939,  0,  0, 
  n10000000000000000941,  n10000000000000000943,  n10000000000000000947,  n10000000000000000949,  0,  0, 
  *10000000000000000951,  n10000000000000000953,  n10000000000000000957,  n10000000000000000959,  10000000000000000951,  1, 
  n10000000000000000961,  n10000000000000000963,  n10000000000000000967,  n10000000000000000969,  0,  0, 
  n10000000000000000971,  n10000000000000000973,  n10000000000000000977,  n10000000000000000979,  0,  0, 
  n10000000000000000981,  n10000000000000000983,  *10000000000000000987,  n10000000000000000989,  10000000000000000987,  1, 
  n10000000000000000991,  n10000000000000000993,  n10000000000000000997,  n10000000000000000999,  0,  0, 
  Total primes quantity between 1000000000000000000 and 1000000000000000100 rows is equal to: 28 
Z tych wyników udało mi sie tylko potwierdzić wartość: 10000000000000000051. Jest wątek na math stack exchange: "Bound on number of zeros in smallest prime greater than 10n"

Więcej wyników z algorytmu PTOQR jest w plikach tekstowych na mojej stronie domowej w dziale RESEARCH:
www.bogusiak.pl/research.
Mam nadzieję, że kogoś to zainteresuje i/lub potwierdzi uzyskane przeze mnie wyniki.

Pomóżcie mi zapisać to w postaci formuły w Latexie. Chodzi głównie o to: rząd czwórki = (n*10)+1,(n*10)+3,(n*10)+7,(n*10)+9; gdzie n zwiększamy w pętli co 1 i jest ze zbioru liczb naturalnych.

Pozdrawiam.
Ostatnio zmieniony 30 sty 2025, o 16:53 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
kitsu-ne
Użytkownik
Użytkownik
Posty: 19
Rejestracja: 25 sty 2025, o 23:25
Płeć: Mężczyzna
wiek: 35
Podziękował: 2 razy
Pomógł: 10 razy

Re: PTOQR - Primes To Quadruple Rows - szybki algorytm znajdowania liczb pierwszych.

Post autor: kitsu-ne »

https://pl.wikipedia.org/wiki/Test_Millera-Rabina jest (w ogólności) probabilistycznym testem pierwszości, ale dla dostatecznie małych liczb wystarczy sprawdzić a = 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37 oraz 41 (i wtedy test staje się deterministyczny). Twoja liczba 8 272 402 618 863 367 641 817 jest dostatecznie mała i okazuje się, że faktycznie jest pierwsza.
Awatar użytkownika
kitsu-ne
Użytkownik
Użytkownik
Posty: 19
Rejestracja: 25 sty 2025, o 23:25
Płeć: Mężczyzna
wiek: 35
Podziękował: 2 razy
Pomógł: 10 razy

Re: PTOQR - Primes To Quadruple Rows - szybki algorytm znajdowania liczb pierwszych.

Post autor: kitsu-ne »

Popatrzyłem na Twój kod. Są trzy związane ze sobą problemy:

- czy dana liczba jest pierwsza? Wygląda na to, że Twoje rozwiązanie to drobne usprawnienie klasycznego algorytmu, który dla danej liczby \(\displaystyle{ n}\) sprawdza, czy jest podzielna przez pewną liczbę od \(\displaystyle{ 2}\) do \(\displaystyle{ n}\). (Najpierw zauważa się, że wystarcza sprawdzać dzielniki do \(\displaystyle{ n/2}\), potem, że do \(\displaystyle{ \sqrt n}\), potem że poza dwójką wystarcza sprawdzać podzielność przez liczby nieparzyste, a jeszcze potem, że wystarczy sprawdzać podzielność przez \(\displaystyle{ 2, 3}\), a potem przez \(\displaystyle{ 5, 5 + 2 = 7, 7 + 4 = 11, 11 + 2 = 13, 13 + 4 = 17, 17 + 2 = 19, 19 + 4 = 23, 23 + 2 = 25, \ldots}\)). Ty dołożyłeś jeszcze podzielność przez pięć: jeśli liczba kończy się piątką i jest co najmniej dwucyfrowa, to nie jest pierwsza. Ten algorytm nie jest najlepszym pomysłem dla dużych liczb. Patrz https://stackoverflow.com/questions/2267146/what-is-the-fastest-integer-factorization-algorithm

- które liczby w przedziale \(\displaystyle{ (1, n)}\) są pierwsze? Tutaj sito jest lepszym pomysłem, bo sprawdza pierwszość wielu liczb "równolegle". (Są różne sita, np. Eratostenesa, Atkina, itd.)

- ile jest liczb pierwszych w danym przedziale? Patrz https://github.com/kimwalisch/primecount
sylvi91
Użytkownik
Użytkownik
Posty: 58
Rejestracja: 10 paź 2017, o 04:40
Płeć: Mężczyzna
wiek: 47
Lokalizacja: Łódź
Podziękował: 6 razy

Re: PTOQR - Primes To Quadruple Rows - szybki algorytm znajdowania liczb pierwszych.

Post autor: sylvi91 »

Witaj w wątku. Cenne uwagi dajesz. Dzięki.
Postaram się wyjaśnić parę szczegółów.
kitsu-ne pisze: 30 sty 2025, o 19:07 Popatrzyłem na Twój kod. Są trzy związane ze sobą problemy:

- czy dana liczba jest pierwsza? Wygląda na to, że Twoje rozwiązanie to drobne usprawnienie klasycznego algorytmu, który dla danej liczby \(\displaystyle{ n}\) sprawdza, czy jest podzielna przez pewną liczbę od \(\displaystyle{ 2}\) do \(\displaystyle{ n}\). (Najpierw zauważa się, że wystarcza sprawdzać dzielniki do \(\displaystyle{ n/2}\), potem, że do \(\displaystyle{ \sqrt n}\), potem że poza dwójką wystarcza sprawdzać podzielność przez liczby nieparzyste, a jeszcze potem, że wystarczy sprawdzać podzielność przez \(\displaystyle{ 2, 3}\), a potem przez \(\displaystyle{ 5, 5 + 2 = 7, 7 + 4 = 11, 11 + 2 = 13, 13 + 4 = 17, 17 + 2 = 19, 19 + 4 = 23, 23 + 2 = 25, \ldots}\)). Ty dołożyłeś jeszcze podzielność przez pięć: jeśli liczba kończy się piątką i jest co najmniej dwucyfrowa, to nie jest pierwsza. Ten algorytm nie jest najlepszym pomysłem dla dużych liczb. Patrz https://stackoverflow.com/questions/2267146/what-is-the-fastest-integer-factorization-algorithm
Tak jak mówisz. To usprawnienie tej popularnej lecz wolnej metody. Prędkość obliczeń wzrasta przez to od 100 do 1000 razy.
Ale zauważ, że algorytm działa trochę inaczej jak podałeś w analizie. Nie dzielę ani przez \(\displaystyle{ 2}\), ani przez \(\displaystyle{ 5}\).
Dzielę przez \(\displaystyle{ 3}\) i \(\displaystyle{ 7}\) oraz kolejno przez \(\displaystyle{ 11, 13, 15, 17, 19, 21}\) i tak dalej, aż do wartości \(\displaystyle{ \sqrt{n}.}\) Oczywiście mógłbym wyeliminować dzielenie przez liczby kończące się cyfrą \(\displaystyle{ 5}\) ale skomplikowało by to trochę procedurę. Liczby naturalne podawane do testów pierwszości i tak już wstępnie nie kończą się cyfrą \(\displaystyle{ 5}\), te, które są jej wielokrotnością są pomijane, tylko liczby kończące się tymi 4 cyframi: \(\displaystyle{ 1,3,7,9}\) są poddawane testowi.
Dziwi mnie, że nie znalazłem tego algorytmu w sieci tylko sam go mogłem opracować jako pierwszy chyba. No ale może to jest właśnie ten mój mały wkład w rozważania na temat liczb pierwszych.
Dzięĸi za link do ciekawego wątku jest tam podanych kilka trudnych algorytmów, będę to zgłębiał jak czas pozwoli.
kitsu-ne pisze: 30 sty 2025, o 19:07 - które liczby w przedziale \(\displaystyle{ (1, n)}\) są pierwsze? Tutaj sito jest lepszym pomysłem, bo sprawdza pierwszość wielu liczb "równolegle". (Są różne sita, np. Eratostenesa, Atkina, itd.)
Nie no, nie zgodzę się z Tobą. Sito Eratostenesa jest algorytmem iteracyjnym, sprawdza pierwszość liczb naturalnych w określonej sekwencji, po kolei, a nie równolegle. Chyba, że napiszemy wersję wielowątkową tego algorytmu, wtedy dla danych przedziałów, liczby będą testowane "prawie "równolegle. Chyba, że czegoś nie rozumiem. No ale sita mimo, że szybkie, to wykorzystują tablicę i to jest ich słaba strona, bo to konsumuje dużo pamięci operacyjnej RAM.
Można bawić się w stronicowanie, ale to komplikuje znacznie kod aplikacji, a mnie zależy na w miarę prostym i niezawodnym rozwiązaniu. Na prostocie i optymalizacji, tak aby jak najmniej cykli procesora wykonywać w pętli.
Jestem pewien, że pokazany kod PTOQRL z użyciem MPFR można jeszcze zoptymalizować i wycisnąć z tej biblioteki znacznie lepsze rezultaty. Nie jestem specem od MPFR, parę procedur napisałem, ale jest tu wiele przydatnych funkcji, których jeszcze nie znam.
kitsu-ne pisze: 30 sty 2025, o 19:07 - ile jest liczb pierwszych w danym przedziale? Patrz https://github.com/kimwalisch/primecount
Nie znałem tej aplikacji. Kod źródłowy jest jednak głównie w C++ i trochę dużo tych plików. A maksymalny przedział sięga do \(\displaystyle{ 10^{31}}\), czyli nie za dużo.
Już mam wyniki z zakresu \(\displaystyle{ 3 \cdot 10^{24}}\) z apki PTOQRL ale nie znalazłem jeszcze tam liczb pierwszych. Działa na jednym wątku już ponad 800 minut i wypluło tylko 7 rzędów z 10 zadanych do obliczenia.
Mam nadzieję, że nie jest to jakiś bug w kodzie i pójdzie zaraz dalej te 3 kroki i skończy.

Nie wiem jak szybki jest ten PRIMECOUNT ale będę go testował i zobaczymy. Lubię wyciskać z procka wszystkie dostępne moce, a ten PRIMECOUNT jest raczej wielowątkowy zatem mógłbym go puścić na maksa na 10 - 12 wątkach.

Co do algorytm PTOQR to zlicza liczby pierwsze dla zadanego przedziału. Na końcu wypisuje w wynikach ile tych liczb znalazł.
Zlicza nawet liczby pierwsze dla zadanych rzędów, a także podaje ich sumę w danym rzędzie.

Właśnie nie widziałem wczęśniej takiego sposobu prezentacji liczb pierwszych w czwórkowych rzędach. Aplikacja robi to poprzez proste formatowanie i użycie poleceń mpfr_print. Można to łatwo zmienić i wypisywać tylko liczby pierwsze w kolejności. Pierwszy raz kiedy do mnie trafiło, że liczby pierwsze mają 4 powtarzalne końcówki, poza pierwszą dzisiątką to było gdy parę lat temu proceduralnie wyrysowałem spiralę pentagonalną z naniesionymi liczbami pierwszymi na wierzchołkach.
Tutaj jest niepozorny wynik tego mojego małego odkrycia: https://commons.wikimedia.org/wiki/File:Spirala_pentagonalna_liczb_pierwszych.png

Chodzi mi po głowie podejście do tego tematu jeszcze raz i umieszczenie liczb pierwszych na spirali pentagonalnej ale wzdłóż krawędzi, analogicznie tak jak liczby pierwsze rozkładają się na kwadratowej Spirali Ulama. Ciekaw jestem tego efektu rozłożenia liczb zaprezentowanego za pomocą kolorowych pikseli w 3 kolorach podstawowych R, G, B i Black do pokolorowania odpowiednio liczb o odpowiednich końcówkach: \(\displaystyle{ 1, 3, 7, 9}\). A początkowe 2, 3, 5, 7 mogły by być na czarno
To jest do zrobienia niby proste, ale też nie widziałem nigdzie w sieci pięciokątnej spirali liczb pierwszych z takim sposobem dystrubucji liczb. Może się kiedyś to zrobi. W końcu cała teoria liczb to mój konik od kilku lat, a programowaniem zajmuję się od dziecka i to uwielbiam.

Pytanie do Ciebie. Masz kod źródłowy tego algorytmu, na który się powołałeś przy potwierdzeniu, że liczba \(\displaystyle{ 8\, 272\, 402\, 618\, 863\, 367\, 641\, 817}\) jest pierwsza? Chodzi mi o ten test Millera Rabina. Czy może inną metodą to sprawdziłeś?

Mam jeszcze dwie kolejne liczby pierwsze:

\(\displaystyle{ 8272402618863367641847\\
8272402618863367641863}\)


Policzenie wszystkich trzech z tamtą podaną wyżej zajęło: 25717 sekund.
Zadałem sprawdzenie tylko 10 rzędów, a czas wykonania to ponad 7 godzin.

No ale tak właśnie można się pobawić tą aplikacją i "strzelać" w kolejne rzędy w poszukiwaniu liczb pierwszych.

Szybciej działa jednak wersja podstawowa z użyciem std math library, no ale doliczy do znacznie mniejszych wartości.

Pozdrawiam.
Ostatnio zmieniony 31 sty 2025, o 16:35 przez Jan Kraszewski, łącznie zmieniany 1 raz.
Powód: Brak LaTeX-a. Proszę zapoznaj się z instrukcją: http://matematyka.pl/latex.htm .
Awatar użytkownika
kitsu-ne
Użytkownik
Użytkownik
Posty: 19
Rejestracja: 25 sty 2025, o 23:25
Płeć: Mężczyzna
wiek: 35
Podziękował: 2 razy
Pomógł: 10 razy

Re: PTOQR - Primes To Quadruple Rows - szybki algorytm znajdowania liczb pierwszych.

Post autor: kitsu-ne »

Usiądę później do Twojego kodu, a teraz odpowiem tylko na pytanie o implementację.

Kod: Zaznacz cały

def miller_rabin_prime?(n, a)
    d = n - 1
    s = 0
    while d % 2 == 0
        d /= 2
        s += 1
    end
    x = a.pow(d, n)
    y = 0
    s.times do
        y = x.pow(2, n)
        return false if y == 1 and x != 1 and x != n-1
        x = y
    end
    y == 1
end

def prime?(n)
  [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41].all? { |g| miller_rabin_prime?(n, g) or n <= g }
end

prime?(8_272_402_618_863_367_641_817) # => true
(Język programowania to Ruby).
Kera
Użytkownik
Użytkownik
Posty: 140
Rejestracja: 8 lis 2014, o 15:33
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 5 razy
Pomógł: 4 razy

Re: PTOQR - Primes To Quadruple Rows - szybki algorytm znajdowania liczb pierwszych.

Post autor: Kera »

pobierz sobie przydatny programik o nazwie CrypTool 1.4.42
ODPOWIEDZ