[comp.lang.c] Smallest prime greater than a given value

jsturges@td2cad.intel.com (jay sturges) (06/28/89)

   I have found that when dealing with whole number results 
   it is a far better to create trivial routines to approximate
   at a lower level of accuracy.  By doing so one can experience
   multitudes of performance increase as well as still achieving
   the same level of accuracy.
  
   The following source code contains a power series for a
   square root function.  I have found that using this function
   you can actually increase performance if accuracy to a real
   value is not required.  As below with calculating a prime
   number only 3 iterations of the power series is required.
   the reflected increase in performance was measured at 4X
   over standard C library sqrt( ).  This was measured on a
   Sun386i system with 80387 coproc
  
   Enjoy the tid-bit
   -Jay  				sun!sacto!pldote!jsturges
  
   
+--+--+--+--+--+  C U T +--+--+--+--+--+
#include <stdio.h>
/*
 * Prime( )
 *
 * simple routine to generate the smallest prime number
 * larger than a given number.  makes use of a very trivial
 * C implementation of a power series square root function.
 * the need for this function is to eliminate the need for 
 * the standard math library.  accuracy is not a issue as 
 * the end result is a whole number.
 *
 * Author:  Jay Sturges		sun!sacto!pldote!jsturges
 * Date  :  June 23, 1989
 *
 * Copyright:  NONE .... Just enjoy
 */

main( argc, argv )
int argc;
char **argv;
{
    argv++; argc--;
    while ( argc-- > 0) {
	printf("Smallest Prime larger --> %d\n",calc_prime(atoi(*argv++)));
    }
}

/*
 * calc_prime( )
 *      calculate the smallest prime larger than a given value
 */
int calc_prime( n )
int n;   			/* whole number as start */
{
int x;
int prime;
    
    x = n + 1;
    prime = 0;
    
    while ( prime <= n ) {
        if ( pchk( x ) && ( x > n ) ) {
            prime = x;			/* is prime */
        }
        else {
            x++;			/* try again */
        }
    }
    
    return( prime );
}

/*
 *  pchk( )
 *    checks if value is prime
 */
int pchk( n )
int n;
{
int max;
int i;
    
    max = trivial_sqrt( n ) + 1;
    
    for (i = 2; i < max; i++) {
        if ( !(n % i) ) {
            return( 0 );
        }
    }
    
    return( 1 );	/* prime */
}

#define M	3		/* minimum iterations for whole numbers */

/*
 * trivial_sqrt( )
 *     return the integer sqrt of the value
 */
int trivial_sqrt( n )
int n;
{
int i;
float x;
float y;
float a;

        y = ( float ) n;
        x = y;


        /*
         * square root 
	 *
	 *                 2
	 *  X    =  X  -  X  -  A
         *   i+1     i     i
         *               ---------
         *                  2X
         *                    i
	 * Where:
	 *        A  = n
	 *        X  = n
	 *         1
	 */
	for ( i = 0; i < M; i++ )
	    x = x - ( ( ( x*x ) - y ) / ( 2 * x ) );

	return( (int) x );
}