piscine-c06-tmp/ex06/ft_is_prime.c

117 lines
2.5 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_is_prime.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tosuman </var/spool/mail/tosuman> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/03/30 16:48:48 by tosuman #+# #+# */
/* Updated: 2023/03/30 16:48:49 by tosuman ### ########.fr */
/* */
/* ************************************************************************** */
#define INT_MAX_SQRT 46340
#define FIRST_PRIMES_LEN 2
#define SIEVE_LEN 2
#define WHEEL 6
// #define FIRST_PRIMES_LEN 3
// #define SIEVE_LEN 8
// #define WHEEL 30
int ft_int_sqrt(int nb)
{
int sqrt;
int old_sqrt;
int max;
int min;
min = 0;
max = nb;
if (nb > INT_MAX_SQRT)
max = INT_MAX_SQRT;
sqrt = max;
while (1)
{
old_sqrt = sqrt;
if (sqrt * sqrt == nb)
return (sqrt);
if (sqrt * sqrt > nb)
max = sqrt;
if (sqrt * sqrt < nb)
min = sqrt;
sqrt = (max + min) / 2;
if (sqrt == old_sqrt)
break ;
}
return (sqrt);
}
int first_divisor(int nb)
{
int wheel;
int idx;
int int_sqrt;
int first_primes[FIRST_PRIMES_LEN];
int sieve6[SIEVE_LEN];
first_primes[0] = 2;
first_primes[1] = 3;
sieve6[0] = 5;
sieve6[1] = 7;
idx = -1;
while (++idx < FIRST_PRIMES_LEN)
if (nb % first_primes[idx] == 0)
return (first_primes[idx]);
int_sqrt = ft_int_sqrt(nb);
wheel = 0;
while (wheel < int_sqrt)
{
idx = -1;
while (++idx < SIEVE_LEN)
if (nb % (sieve6[idx] + wheel) == 0)
return (sieve6[idx] + wheel);
wheel += WHEEL;
}
return (nb);
}
int ft_is_prime(int nb)
{
if (nb < 2)
return (0);
return (first_divisor(nb) == nb);
}
/* ////
#include <stdio.h>
#include <limits.h>
int main(void)
{
int i;
int prime_count;
prime_count = 0;
i = -10;
while (++i <= INT_MAX / 1000)
{
if (ft_is_prime(i))
{
// printf("Prime: %d\n", i);
++prime_count;
}
}
printf("Prime count up until %d: %d\n", INT_MAX / 1000, prime_count);
return (0);
}
// first_primes[2] = 5;
// sieve30[0] = 7;
// sieve30[1] = 11;
// sieve30[2] = 13;
// sieve30[3] = 17;
// sieve30[4] = 19;
// sieve30[5] = 23;
// sieve30[6] = 29;
// sieve30[7] = 31;
*/ ////