8 Commits
v0.2.1 ... v0.3

5 changed files with 39 additions and 14 deletions

View File

@ -9,3 +9,10 @@ Change Log
- Switch to C. - Switch to C.
- Uses GNU Multiple Precision library (GMP) to hold prime numbers, allowing for 'infinite' size. - Uses GNU Multiple Precision library (GMP) to hold prime numbers, allowing for 'infinite' size.
- Add `likely()' and `unlikely()' macros to optimize. - Add `likely()' and `unlikely()' macros to optimize.
- v0.2.1: Memory Leak Fixes
- Fixed a major memory leak at the end of the program.
- Added more optimizers.
- v0.3: Optimizations
- Algorithm skips half the known primes.
- Removed `likely()' and `unlikely()' macros due to lack of information.
- Improved performance.

15
TODO.md Normal file
View File

@ -0,0 +1,15 @@
To-Do
=====
A to-do list for the project. Feel free to remove items as you solve them in your pull requests.
Next
----
To-do items to do for the next version:
- Profile code to better use `likely()` and `unlikely()` macros.
Features
--------
Features for future versions (not _Next_) of Indivisible:
- Implement multi-threaded version using OpenCL or OpenMP (whichever works).

View File

@ -2,8 +2,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "optimizers.h"
/** /**
* This is the number of elements by which the list expands. * This is the number of elements by which the list expands.
* WARNING: Always use doubles for this number (2^X) * WARNING: Always use doubles for this number (2^X)
@ -28,14 +26,14 @@ void deInitList(List *l) {
} }
void addToList(List *l, mpz_t n) { void addToList(List *l, mpz_t n) {
if(unlikely(l->end == l->size)) { if(l->end == l->size) {
l->size += BLOCK_SIZE; l->size += BLOCK_SIZE;
if(unlikely(l->size == 0)) { if(l->size == 0) {
fprintf(stderr, "`l->size' has overflowed!\n"); fprintf(stderr, "`l->size' has overflowed!\n");
exit(1); exit(1);
} }
void *tmp = realloc(l->list, sizeof(mpz_t) * l->size); void *tmp = realloc(l->list, sizeof(mpz_t) * l->size);
if(unlikely(!tmp)) { if(!tmp) {
fprintf(stderr, "Failed to allocate more memory to list!\n"); fprintf(stderr, "Failed to allocate more memory to list!\n");
exit(1); exit(1);
} }

View File

@ -6,13 +6,12 @@
#include "list.h" #include "list.h"
#include "types.h" #include "types.h"
#include "optimizers.h"
static bool run; static bool run;
void leave(); void leave();
int main(void) { int main(void) {
printf("Indivisible v0.2\n"); puts("Indivisible v0.2\n");
// Quit on ^C by setting `run = false' // Quit on ^C by setting `run = false'
run = true; run = true;
@ -36,9 +35,16 @@ int main(void) {
printf("\n"); printf("\n");
mpz_add_ui(num, num, 1); mpz_add_ui(num, num, 1);
// Variable for half `num'
mpz_t halfNum;
mpz_init(halfNum);
do { do {
// Calculate half of `num'
mpz_fdiv_q_ui(halfNum, num, 2);
// Loop through found primes // Loop through found primes
for(ulli i = 0; i < primes.size; ++i) { // Skip 2 because we're skipping even nymbers
for(ulli i = 1; mpz_cmp(primes.list[i], halfNum) >= 0; ++i) {
// If `num' is divisible by a prime then go to the next number // If `num' is divisible by a prime then go to the next number
if(mpz_divisible_p(num, primes.list[i]) != 0) if(mpz_divisible_p(num, primes.list[i]) != 0)
goto nextPrime; goto nextPrime;
@ -46,7 +52,7 @@ int main(void) {
// `num' is a prime so we add it to the list and print it // `num' is a prime so we add it to the list and print it
addToList(&primes, num); addToList(&primes, num);
if(unlikely(mpz_out_str(stdout, 10, num) == 0)) { if(mpz_out_str(stdout, 10, num) == 0) {
fprintf(stderr, "Could not print to `stdout'!\n"); fprintf(stderr, "Could not print to `stdout'!\n");
exit(1); exit(1);
} }
@ -55,8 +61,10 @@ int main(void) {
nextPrime: nextPrime:
// Add 2 (skip even numbers since they're all divisible by 2) // Add 2 (skip even numbers since they're all divisible by 2)
mpz_add_ui(num, num, 2); mpz_add_ui(num, num, 2);
} while(likely(run)); } while(run);
// Clear GMP variables
mpz_clear(halfNum);
mpz_clear(num); mpz_clear(num);
// Deinitialize the list // Deinitialize the list
deInitList(&primes); deInitList(&primes);
@ -64,6 +72,6 @@ nextPrime:
} }
void leave() { void leave() {
printf("Exiting...\n"); puts("Exiting...\n");
run = false; run = false;
} }

View File

@ -1,3 +0,0 @@
#pragma once
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)