Math-Prime-XS

 view release on metacpan or  search on metacpan

XS.xs  view on Meta::CPAN

    OUTPUT:
      RETVAL

void
xs_mod_primes (number, base)
      unsigned long number
      unsigned long base
    PROTOTYPE: $$
    INIT:
      unsigned long i, n;
    PPCODE:
      /* For the sqrt(), casting double->ulong probably follows the fpu
         rounding mode, so might round either up or down.  If up then the
         last trial division may be unnecessary, but not harmful.
       */

      /* special case for 2 if it's in range, then can use n+=2 for odd n in
         the loop */
      if (base <= 2) {
        base = 3;
        if (number >= 2) {

XS.xs  view on Meta::CPAN

xs_sieve_primes (number, base)
      unsigned long number
      unsigned long base
    PROTOTYPE: $$
    ALIAS:
     xs_sieve_count_primes = 1
    INIT:
      unsigned long *composite = NULL;
      unsigned long i, n;
      unsigned long count = 0;
    PPCODE:
      const unsigned long square_root = sqrt (number); /* truncates */
      const unsigned int size_bits = sizeof (unsigned long) * BYTE_BITS;

      Newxz (composite, (BIT_VECTOR (number) / size_bits) + 1, unsigned long);

      for (n = 3; n <= square_root; n += 2) /* uneven numbers only */
        {
          /* (n * n) - start with square */
          /* (2 * n) - skip even number  */
          for (i = (n * n); i <= number; i += (2 * n))

XS.xs  view on Meta::CPAN


void
xs_sum_primes (number, base)
      unsigned long number
      unsigned long base
    PROTOTYPE: $$
    INIT:
      unsigned long *primes = NULL, *sums = NULL;
      unsigned int pos = 0;
      unsigned long n;
    PPCODE:
      for (n = 2; n <= number; n++)
        {
          bool is_prime = TRUE;
          const unsigned long square_root = sqrt (n); /* truncates */
          unsigned int c;
          for (c = 0; c < pos && primes[c] <= square_root; c++)
            {
              unsigned long sum = sums[c];
              while (sum < n)
                sum += primes[c];

XS.xs  view on Meta::CPAN

void
xs_trial_primes (number, base)
      unsigned long number
      unsigned long base
    PROTOTYPE: $$
    INIT:
      unsigned long *primes = NULL;
      unsigned int pos = 0;
      unsigned long start = 1;
      unsigned long i, n;
    PPCODE:
      for (n = 2; n <= number; n++)
        {
          bool is_prime = TRUE;
          unsigned long square_root; /* calculate later for efficiency */
          if (n > 2 && EVEN_NUM (n))
            continue;
          square_root = sqrt (n); /* truncates */
          for (i = start; i <= square_root; i++)
            {
              bool save_as_prime = TRUE;



( run in 1.673 second using v1.01-cache-2.11-cpan-71847e10f99 )