diff options
author | Niels Möller <nisse@lysator.liu.se> | 2019-01-12 17:31:21 +0100 |
---|---|---|
committer | Niels Möller <nisse@lysator.liu.se> | 2019-01-12 17:31:21 +0100 |
commit | 2767ebce0861775dd54b9a71e25c13fbbedc3f4a (patch) | |
tree | aa50690fe2321fe540aaf19042624d4cfbf0c8af | |
parent | 1f5b9812dec00811344ab080444c0582f6405533 (diff) | |
download | nettle-2767ebce0861775dd54b9a71e25c13fbbedc3f4a.tar.gz |
Delete eratosthenseprogram
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | examples/Makefile.in | 5 | ||||
-rw-r--r-- | examples/eratosthenes.c | 422 |
3 files changed, 6 insertions, 426 deletions
@@ -1,3 +1,8 @@ +2019-01-12 Niels Möller <nisse@lysator.liu.se> + + * examples/eratosthenes.c: Deleted program. + * examples/Makefile.in: Delete rule to build and distribute it. + 2019-01-10 Niels Möller <nisse@lysator.liu.se> * testsuite/rsa-compute-root-test.c (test_one): Use %u and diff --git a/examples/Makefile.in b/examples/Makefile.in index 43a06bc5..a7152a57 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -24,7 +24,7 @@ TARGETS = nettle-benchmark$(EXEEXT) eratosthenes$(EXEEXT) \ $(ENC_TARGETS) @IF_HOGWEED@ $(HOGWEED_TARGETS) SOURCES = nettle-benchmark.c hogweed-benchmark.c ecc-benchmark.c \ - eratosthenes.c random-prime.c \ + random-prime.c \ nettle-openssl.c \ io.c read_rsa_key.c \ rsa-encrypt.c rsa-decrypt.c rsa-keygen.c rsa-sign.c rsa-verify.c \ @@ -94,9 +94,6 @@ base64dec$(EXEEXT): base64dec.$(OBJEXT) io.$(OBJEXT) $(LINK) base64dec.$(OBJEXT) io.$(OBJEXT) \ -lnettle $(LIBS) -o base64dec$(EXEEXT) -eratosthenes$(EXEEXT): eratosthenes.$(OBJEXT) $(GETOPT_OBJS) - $(LINK) eratosthenes.$(OBJEXT) $(GETOPT_OBJS) -o eratosthenes$(EXEEXT) - BENCH_OBJS = nettle-benchmark.$(OBJEXT) nettle-openssl.$(OBJEXT) \ $(GETOPT_OBJS) ../nettle-internal.$(OBJEXT) timing.$(OBJEXT) nettle-benchmark$(EXEEXT): $(BENCH_OBJS) diff --git a/examples/eratosthenes.c b/examples/eratosthenes.c deleted file mode 100644 index 38574778..00000000 --- a/examples/eratosthenes.c +++ /dev/null @@ -1,422 +0,0 @@ -/* eratosthenes.c - - An implementation of the sieve of Eratosthenes, to generate a list of primes. - - Copyright (C) 2007 Niels Möller - - This file is part of GNU Nettle. - - GNU Nettle is free software: you can redistribute it and/or - modify it under the terms of either: - - * the GNU Lesser General Public License as published by the Free - Software Foundation; either version 3 of the License, or (at your - option) any later version. - - or - - * the GNU General Public License as published by the Free - Software Foundation; either version 2 of the License, or (at your - option) any later version. - - or both in parallel, as here. - - GNU Nettle is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received copies of the GNU General Public License and - the GNU Lesser General Public License along with this program. If - not, see http://www.gnu.org/licenses/. -*/ - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include <assert.h> -#include <limits.h> -#include <stdio.h> -#include <stdlib.h> - -#include "getopt.h" - -#ifdef SIZEOF_LONG -# define BITS_PER_LONG (CHAR_BIT * SIZEOF_LONG) -# if BITS_PER_LONG > 32 -# define NEED_HANDLE_LARGE_LONG 1 -# else -# define NEED_HANDLE_LARGE_LONG 0 -# endif -#else -# define BITS_PER_LONG (CHAR_BIT * sizeof(unsigned long)) -# define NEED_HANDLE_LARGE_LONG 1 -#endif - - -static void -usage(void) -{ - fprintf(stderr, "Usage: erathostenes [OPTIONS] [LIMIT]\n\n" - "Options:\n" - " -? Display this message.\n" - " -b SIZE Block size.\n" - " -v Verbose output.\n" - " -s No output.\n"); -} - -static unsigned -isqrt(unsigned long n) -{ - unsigned long x; - - /* FIXME: Better initialization. */ - if (n < ULONG_MAX) - x = n; - else - /* Must avoid overflow in the first step. */ - x = n-1; - - for (;;) - { - unsigned long y = (x + n/x) / 2; - if (y >= x) - return x; - - x = y; - } -} - -/* Size is in bits */ -static unsigned long * -vector_alloc(unsigned long size) -{ - unsigned long end; - unsigned long *vector; - - assert (size <= ULONG_MAX - (BITS_PER_LONG - 1)); - - end = (size + BITS_PER_LONG - 1) / BITS_PER_LONG; - vector = malloc (end * sizeof(*vector)); - - if (!vector) - { - fprintf(stderr, "Insufficient memory.\n"); - exit(EXIT_FAILURE); - } - return vector; -} - -static void -vector_init(unsigned long *vector, unsigned long size) -{ - unsigned long end, i; - - assert (size <= ULONG_MAX - (BITS_PER_LONG - 1)); - end = (size + BITS_PER_LONG - 1) / BITS_PER_LONG; - - for (i = 0; i < end; i++) - vector[i] = ~0UL; -} - -static void -vector_clear_bits (unsigned long *vector, unsigned long step, - unsigned long start, unsigned long size) -{ - unsigned long bit; - - for (bit = start; bit < size; bit += step) - { - unsigned long i = bit / BITS_PER_LONG; - unsigned long mask = 1L << (bit % BITS_PER_LONG); - - vector[i] &= ~mask; - } -} - -static unsigned -find_first_one (unsigned long x) -{ - static const unsigned char table[0x101] = - { - 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 12, 0, 0, 0, 0, 0, 0, 0,11, 0, 0, 0,10, 0, 9, 8, - 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7, - }; - - unsigned i = 0; - - /* Isolate least significant bit */ - x &= -x; - -#if NEED_HANDLE_LARGE_LONG -#ifndef SIZEOF_LONG - /* Can not be tested by the preprocessor. May generate warnings - when long is 32 bits. */ - if (BITS_PER_LONG > 32) -#endif - while (x >= 0x100000000L) - { - x >>= 32; - i += 32; - } -#endif /* NEED_HANDLE_LARGE_LONG */ - - if (x >= 0x10000) - { - x >>= 16; - i += 16; - } - return i + table[128 + (x & 0xff) - (x >> 8)]; -} - -/* Returns size if there's no more bits set */ -static unsigned long -vector_find_next (const unsigned long *vector, unsigned long bit, unsigned long size) -{ - unsigned long end = (size + BITS_PER_LONG - 1) / BITS_PER_LONG; - unsigned long i = bit / BITS_PER_LONG; - unsigned long mask = 1L << (bit % BITS_PER_LONG); - unsigned long word; - - if (i >= end) - return size; - - for (word = vector[i] & ~(mask - 1); !word; word = vector[i]) - if (++i >= end) - return size; - - /* Next bit is the least significant bit of word */ - return i * BITS_PER_LONG + find_first_one(word); -} - -/* For benchmarking, define to do nothing (otherwise, most of the time - will be spent converting the output to decimal). */ -#define OUTPUT(n) printf("%lu\n", (n)) - -static long -atosize(const char *s) -{ - char *end; - long value = strtol(s, &end, 10); - - if (value <= 0) - return 0; - - /* FIXME: Doesn't check for overflow. */ - switch(*end) - { - default: - return 0; - case '\0': - break; - case 'k': case 'K': - value <<= 10; - break; - case 'M': - value <<= 20; - break; - } - return value; -} - -int -main (int argc, char **argv) -{ - /* Generate all primes p <= limit */ - unsigned long limit; - unsigned long root; - - unsigned long limit_nbits; - - /* Represents numbers up to sqrt(limit) */ - unsigned long sieve_nbits; - unsigned long *sieve; - /* Block for the rest of the sieving. Size should match the cache, - the default value corresponds to 64 KB. */ - unsigned long block_nbits = 64L << 13; - unsigned long block_start_bit; - unsigned long *block; - - unsigned long bit; - int silent = 0; - int verbose = 0; - int c; - - enum { OPT_HELP = 300 }; - static const struct option options[] = - { - /* Name, args, flag, val */ - { "help", no_argument, NULL, OPT_HELP }, - { "verbose", no_argument, NULL, 'v' }, - { "block-size", required_argument, NULL, 'b' }, - { "quiet", required_argument, NULL, 'q' }, - { NULL, 0, NULL, 0} - }; - - while ( (c = getopt_long(argc, argv, "svqb:", options, NULL)) != -1) - switch (c) - { - case OPT_HELP: - usage(); - return EXIT_SUCCESS; - case 'b': - block_nbits = CHAR_BIT * atosize(optarg); - if (!block_nbits) - { - usage(); - return EXIT_FAILURE; - } - break; - - case 'q': - silent = 1; - break; - - case 'v': - verbose++; - break; - - case '?': - return EXIT_FAILURE; - - default: - abort(); - } - - argc -= optind; - argv += optind; - - if (argc == 0) - limit = 1000; - else if (argc == 1) - { - limit = atol(argv[0]); - if (limit < 2) - return EXIT_SUCCESS; - } - else - { - usage(); - return EXIT_FAILURE; - } - - root = isqrt(limit); - /* Round down to odd */ - root = (root - 1) | 1; - /* Represents odd numbers from 3 up. */ - sieve_nbits = (root - 1) / 2; - - if (verbose) - fprintf(stderr, "Initial sieve using %lu bits.\n", sieve_nbits); - - if (!silent) - printf("2\n"); - - if (limit == 2) - return EXIT_SUCCESS; - - sieve = vector_alloc(sieve_nbits); - vector_init(sieve, sieve_nbits); - - for (bit = 0; - bit < sieve_nbits; - bit = vector_find_next(sieve, bit + 1, sieve_nbits)) - { - unsigned long n = 3 + 2 * bit; - /* First bit to clear corresponds to n^2, which is bit - - (n^2 - 3) / 2 = (n + 3) * bit + 3 - */ - unsigned long n2_bit = (n+3)*bit + 3; - - if (!silent) - printf("%lu\n", n); - - vector_clear_bits (sieve, n, n2_bit, sieve_nbits); - } - - limit_nbits = (limit - 1) / 2; - - if (sieve_nbits + block_nbits > limit_nbits) - block_nbits = limit_nbits - sieve_nbits; - - if (verbose) - { - double storage = block_nbits / 8.0; - unsigned shift = 0; - const char prefix[] = " KMG"; - - while (storage > 1024 && shift < 3) - { - storage /= 1024; - shift++; - } - fprintf(stderr, "Blockwise sieving using blocks of %lu bits (%.3g %cByte)\n", - block_nbits, storage, prefix[shift]); - } - - block = vector_alloc(block_nbits); - - for (block_start_bit = bit; block_start_bit < limit_nbits; block_start_bit += block_nbits) - { - unsigned long block_start; - - if (block_start_bit + block_nbits > limit_nbits) - block_nbits = limit_nbits - block_start_bit; - - vector_init(block, block_nbits); - - block_start = 3 + 2*block_start_bit; - - if (verbose > 1) - fprintf(stderr, "Next block, n = %lu\n", block_start); - - /* Sieve */ - for (bit = 0; bit < sieve_nbits; - bit = vector_find_next(sieve, bit + 1, sieve_nbits)) - { - unsigned long n = 3 + 2 * bit; - unsigned long sieve_start_bit = (n + 3) * bit + 3; - - if (sieve_start_bit < block_start_bit) - { - unsigned long k = (block_start + n - 1) / (2*n); - sieve_start_bit = n * k + bit; - - assert(sieve_start_bit < block_start_bit + n); - } - assert(sieve_start_bit >= block_start_bit); - - vector_clear_bits(block, n, sieve_start_bit - block_start_bit, block_nbits); - } - for (bit = vector_find_next(block, 0, block_nbits); - bit < block_nbits; - bit = vector_find_next(block, bit + 1, block_nbits)) - { - unsigned long n = block_start + 2 * bit; - if (!silent) - printf("%lu\n", n); - } - } - - free(sieve); - free(block); - - return EXIT_SUCCESS; -} |