primes.h 946 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #ifdef _PRIMES_H
  2. #define _PRIMES_H
  3. #include <stdint.h>
  4. #include <stdbool.h>
  5. #include "da.h"
  6. DA_STRUCT_DEF(uint64_t, primes);
  7. bool isprime(uint64_t n);
  8. void primes_fill(struct primes_da *primes);
  9. void primes_fill_with(struct primes *primes, uint64_t n);
  10. #if defined(IMP) || defined(PRIMES_IMP)
  11. void
  12. primes_fill_with(struct primes *primes, uint64_t n)
  13. {
  14. uint64_t i = 0;
  15. for ( ; primes->size < n; ++i ) {
  16. if ( isprime(i) ) {
  17. DA_APPEND(*primes, i);
  18. }
  19. }
  20. }
  21. bool
  22. isprime(uint64_t n)
  23. {
  24. uint64_t i = 0;
  25. if ( (n & 1) == 0 ) {
  26. return ( n == 2 );
  27. }
  28. for ( i = 2; i < n; ++i ) {
  29. if ( (n % i) == 0 ) {
  30. return false;
  31. }
  32. }
  33. return true;
  34. }
  35. void
  36. primes_fill(struct primes_da *primes)
  37. {
  38. uint64_t i = primes->size;
  39. if ( i == 0 ) {
  40. i = 2;
  41. }
  42. for ( ; primes->size < primes->cap; ++i ) {
  43. if ( isprime(i) ) {
  44. primes->data[primes->size++] = i;
  45. }
  46. }
  47. }
  48. #endif /* defined(IMP) || defined(PRIMES_IMP) */
  49. #endif /* _PRIMES_H */