@@ -7,12 +7,6 @@ int tab[SIZE];
7
7
long int * primes = NULL ;
8
8
int nb_primes = 0 ;
9
9
10
- long double log_b (long double x , long double b ){ /* It computes logarithm in base b */
11
- long double res = (long double )(logl (x )/logl (b ));
12
- return res ;
13
- }
14
-
15
-
16
10
void count_prime (void ){
17
11
int i ;
18
12
for (i = 0 ; i < SIZE ; i ++ ){
@@ -54,35 +48,25 @@ void crible(void){ /* Classical algorithm to find prime numbers */
54
48
}
55
49
}
56
50
57
- long int count_p (long int p , long int low , long int high ){ /* count the number of almost prime numbers with divisor p between low and high */
58
- long int m = (long int )ceill (log_b ((long double )low , (long double )p )), M = (long int )(log_b ((long double )high , (long double )p ));
59
-
60
- if (M - m < 0 ){
61
- return 0 ;
51
+ long int count_p (long int p , long int low , long int high ){
52
+ long int i = 0 , l = p * p ;
53
+ while (l < low ){
54
+ l *= p ;
62
55
}
63
- else if (M - m == 0 )
64
- return 1 ;
65
- else
66
- return M - m ;
67
- }
68
-
69
- long int count_putain (long int p , long int low , long int high ){
70
- long int k = 2 , i = 0 ;
71
- while (powl (p ,k ) < low )
72
- k ++ ;
73
- while (powl (p , k ) <= high ){
56
+ while (l <= high ){ /* we just count de p^k in [low,high] */
74
57
i ++ ;
75
- k ++ ;
58
+ l *= p ;
76
59
}
77
60
78
61
return i ;
79
62
}
80
63
81
64
long int count (long int low , long int high ){
82
- long int i ;
65
+ long int i = 0 ;
83
66
long int sum = 0 ;
84
- for (i = 0 ; i < nb_primes ; i ++ ){
85
- sum += count_putain (primes [i ], low , high );
67
+ while (primes [i ]* primes [i ] <= high && i < nb_primes ){
68
+ sum += count_p (primes [i ], low , high ); /* We count the number of pseudo prime number of the form p^k */
69
+ i ++ ;
86
70
}
87
71
88
72
return sum ;
0 commit comments