/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* ft_is_prime.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: 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 #include 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; */ ////