Compare commits

...

72 Commits
v0.5 ... master

Author SHA1 Message Date
Nicolás Ortega Froysa
23b8d988e8 Added useful comments. 2019-10-08 18:02:45 +02:00
Nicolás Ortega Froysa
84687f86c1 Using a better algorithm based on property of primes.
I recently found out that `p` being prime, while `p > 3`, then
`p = 6*k (+/-) 1`.
2019-10-08 17:58:08 +02:00
Nicolás Ortega Froysa
2cfc24afb7 Forgot to print 2. 2019-10-08 17:10:39 +02:00
Nicolás Ortega Froysa
d61ef9b034 Entire OpenMPI library is required. 2019-10-08 15:36:33 +02:00
Nicolás Ortega Froysa
23592a98ed Create linked list interface. 2019-09-24 08:20:09 +02:00
Nicolás Ortega Froysa
fadcafaeaf Begin linking to MPI. 2019-09-24 08:19:47 +02:00
Nicolás Ortega Froysa
63e2eda663 Switch to using linked list. 2019-09-24 07:10:12 +02:00
Nicolás Ortega Froysa
d5fb2b06df New objective for v2.0 2019-09-24 07:07:26 +02:00
Nicolás Ortega Froysa
68ac85f3f0 Code refractoring. 2019-09-23 20:44:23 +02:00
Nicolás Ortega Froysa
4d470a14de
Use the MPI compiler. 2018-10-21 10:24:57 +02:00
Nicolás A. Ortega Froysa
874cc75431
Only test up to the sqrt. 2018-10-19 09:05:46 +02:00
Nicolás Ortega Froysa
d2e037e357
Added MPI flags. 2018-10-18 15:26:02 +02:00
Nicolás Ortega Froysa
90158fb04c
Doxygen is no longer in use. 2018-10-18 15:08:29 +02:00
Nicolás Ortega Froysa
bb26ae9b9f
Removed CI file. 2018-10-18 15:07:47 +02:00
Nicolás Ortega Froysa
1b0b8fd443
Removed args.h file. 2018-10-18 15:05:33 +02:00
Nicolás Ortega Froysa
e06e40af3b
Implement verbose option. 2018-10-18 15:05:01 +02:00
Nicolás Ortega Froysa
eaa238a900
Basic prime calculator. 2018-10-18 14:56:15 +02:00
Nicolás Ortega Froysa
bd3181a1a0
Added linked list. 2018-10-18 12:50:57 +02:00
Nicolás Ortega Froysa
89811c1d02
Added new source files. 2018-10-18 12:04:07 +02:00
Nicolás Ortega Froysa
01a32c0e52
Fresh new start. 2018-10-18 12:00:32 +02:00
Nicolás Ortega Froysa
7aceb7fcc7
Remove CMake policy.
The old policy caused issues because it's about to be lost in the newer
versions of CMake, so we'll have to deal with warnings from CMake until
the FindOpenMP.cmake file is updated.
2017-10-03 16:53:34 +02:00
Nicolás Ortega Froysa
3348d52c49
Don't allow writing to the same file. 2017-09-17 05:46:03 +02:00
Nicolás Ortega Froysa
c73bfd1501
Changing BLOCK_SIZE default and allowing override.
The larger BLOCK_SIZE is the less time it has to spend expanding memory,
the faster it gets.
2017-08-03 12:57:34 -05:00
Nicolás A. Ortega
2afe144e7f
Give install instructions. 2017-03-27 16:22:16 +02:00
Nicolás A. Ortega
a988711918
Fixed progress measurement. 2017-03-16 14:59:53 +01:00
Nicolás A. Ortega
74a82e2038
Case insensitive. 2017-03-16 14:59:26 +01:00
Nicolás A. Ortega
659bdeee27
Handle export errors. 2017-02-14 12:57:11 +01:00
Nicolás A. Ortega
d39a51baa2
Add license information to all source files. 2017-02-14 12:49:54 +01:00
Nicolás A. Ortega
7fa4d9d2bf
Added stuff to CHANGELOG for v1.0 2017-02-13 17:08:30 +01:00
Nicolás A. Ortega
6ed153b9e2
Will be disabling merge requests. 2017-02-13 10:09:25 +01:00
Nicolás A. Ortega
c8d1c095ba
Clarify. 2017-02-13 09:56:23 +01:00
Nicolás A. Ortega
ae8cbed179
Details... 2017-02-13 09:55:31 +01:00
Nicolás A. Ortega
69028a15c8
Promote patches. 2017-02-13 09:54:13 +01:00
Nicolás A. Ortega
b20733f3ac
Append new primes to the end of a file. 2017-02-13 09:47:47 +01:00
Nicolás A. Ortega
2b5541d2c3
Fixed some memory leaks. 2017-02-12 19:33:57 +01:00
Nicolás A. Ortega
94248612ba
Find the nth prime. 2017-02-06 18:00:34 +01:00
Nicolás A. Ortega
8ee18c8c4b
Forget it, it's unnecessary. 2017-02-06 17:51:07 +01:00
Nicolás A. Ortega
bdea1979e8
Use inline functions. 2017-02-06 17:50:26 +01:00
Nicolás A. Ortega
a3ec19d47c
Cleaned the code. 2017-02-02 19:53:29 +01:00
Nicolás A. Ortega
22239ec644
Preparing for v1.0 release. 2017-02-02 10:46:34 +01:00
Nicolás A. Ortega
22278999e7
Fixed algorithm problem. 2017-02-02 10:35:43 +01:00
Nicolás A. Ortega
a5b68282b3
Cancel if `primes.list[i] >= numRoot'.
It has been solved!!!
2017-02-01 23:12:23 +01:00
Nicolás A. Ortega
b9cafadf8e
Parallelized, but needs algorithm optimization. 2017-02-01 19:36:05 +01:00
Nicolás A. Ortega
32076a67cd
Remove parallelization code to start anew. 2017-02-01 17:18:03 +01:00
Nicolás A. Ortega
9673a4da57
Use shared as default. 2017-01-31 22:24:06 +01:00
Nicolás A. Ortega
76936644cd
Almost completely parallelized. 2017-01-31 19:39:35 +01:00
Nicolás A. Ortega
a6ecea514f Restrict will no longer apply to `addToList' 2017-01-17 00:11:51 +01:00
Nicolás A. Ortega
22c7702cf0
We only need to test up to the sqrt(num). 2017-01-01 17:05:25 +01:00
Nicolás A. Ortega
f8726497a4
Don't test for divisibility by 2.
We skip all even numbers, so we can skip 2, this also means giving 3 as
a given.
2016-12-30 17:57:28 +01:00
Nicolás A. Ortega
3e902efd18
Small cleanup. 2016-12-30 17:51:48 +01:00
Nicolás A. Ortega
3246870b75
Better help information. 2016-12-28 14:43:17 +01:00
Nicolás A. Ortega
09166efe89
Small improvements and optimizations.
All error catching is now in `main.c' so we can neatly release memory as
well as adding the `restrict' optimizer to the `addToList()' function.
2016-12-28 00:30:31 +01:00
Nicolás A. Ortega
8b35c5aea3
Fixed title for v0.7 2016-12-27 22:53:22 +01:00
Nicolás A. Ortega
1264edc8c8
We're going to release v0.7 first. 2016-12-27 22:52:06 +01:00
Nicolás A. Ortega
63aa8e14cb
Fixed the damn exporting for once.
Now I'm checking to see if it was actually worth a damn to have raw
files in the first place (-_-;).
2016-12-27 22:34:34 +01:00
Nicolás A. Ortega
f2eb3e869e
Fixed the file issue...
but the export issue still remains -_- I hate seg faults.
2016-12-27 21:47:16 +01:00
Nicolás A. Ortega
a695cce709
Moving shit to files.c 2016-12-27 21:31:24 +01:00
Nicolás A. Ortega
096cb2eb16
Moving file I/O to own file. Everything works except export. 2016-12-26 18:50:51 +01:00
Nicolás A. Ortega
1783b16024
Use raw I/O for file saving. 2016-12-26 16:51:51 +01:00
Nicolás A. Ortega
c602b5fe1b
Added OpenMP to CI. 2016-12-26 16:35:52 +01:00
Nicolás A. Ortega
6b2411e860
Now using OpenMP for parallel programming and next version is v1.0 2016-12-26 15:57:28 +01:00
Nicolás A. Ortega
6c2f96416b
Read and write primes to and from file. 2016-12-26 15:56:56 +01:00
Nicolás A. Ortega
fa3f2dd2b1
New goal before paralellization 2016-12-22 16:31:24 +01:00
Nicolás A. Ortega
591ee92971
Cast is unnecessary in C. 2016-12-15 15:16:04 +01:00
Nicolás A. Ortega
803c6f9e06
`size_t' makes this safeguard unnecessary. 2016-12-14 23:42:20 +01:00
Nicolás A. Ortega
4390fca3ef
Added comments. 2016-12-14 23:38:22 +01:00
Nicolás A. Ortega
2629c12f1a
Set goal for v1.0 2016-12-14 22:26:43 +01:00
Nicolás A. Ortega
af79d206d3
Added entry for v0.6 2016-12-14 20:12:46 +01:00
Nicolás A. Ortega
4b034ce5e3
Print more info about the file writing. 2016-12-14 19:34:50 +01:00
Nicolás A. Ortega
f146dbf11c
Able to save found primes to a file afterwards. 2016-12-14 19:28:28 +01:00
Nicolás A. Ortega
656fee720e
Allow user to choose base. 2016-12-14 19:06:33 +01:00
Nicolás A. Ortega
5e45656e1a
Forgot that from the switch to C. 2016-12-14 17:58:12 +01:00
22 changed files with 392 additions and 2859 deletions

9
.gitignore vendored
View File

@ -1,9 +1,6 @@
# Ignore build files
build/*
!build/.keep
# Ignore documentation
doc/
# Ignore binary files
*.o
indivisible
# Ignore vim temporary files
*.sw[a-z]

View File

@ -1,20 +0,0 @@
image: gcc
build:
stage: build
# Install dependencies
before_script:
- apt update && apt -y install cmake libgmp-dev
# Build the project
script:
- cd build/
- cmake -DCMAKE_BUILD_TYPE=Release ..
- make
# Find the resulting binary
artifacts:
paths:
- build/indivisible
# Cache .o files for faster compiling
cache:
paths:
- "build/CMakeFiles/indivisible.dir/src/*.o"

View File

@ -1,8 +0,0 @@
Authors
=======
These are a list of people that have contributed to the Uhn project.
| **Name/Alias** | **E-Mail** |
|---------------------------|---------------------------------------|
| Deathsbreed | deathsbreed@themusicinnoise.net |

View File

@ -1,25 +1,42 @@
Change Log
==========
- v0.1: Initial release
- Basic prime calculation.
- Uses a growing vector of known primes and gets the modulus of the number divided by these primes.
- Uses type `long long' to hold prime numbers.
- v0.2: Multi-Precision
- Switch to C.
- Uses GNU Multiple Precision library (GMP) to hold prime numbers, allowing for 'infinite' size.
- 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.
- v0.4: Fixed Algorithm
- Fixed algorithm to actually calculate primes.
- Added extra C99 optimizations.
- v0.5: Minor Changes
- Use `size_t' instead of `unsigned long long int'.
- Minor optimizations to the algorithm.
- Added commandline argument parsing.
- v0.1: Initial release
- Basic prime calculation.
- Uses a growing vector of known primes and gets the modulus of the number divided by these primes.
- Uses type `long long' to hold prime numbers.
- v0.2: Multi-Precision
- Switch to C.
- Uses GNU Multiple Precision library (GMP) to hold prime numbers, allowing for 'infinite' size.
- 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.
- v0.4: Fixed Algorithm
- Fixed algorithm to actually calculate primes.
- Added extra C99 optimizations.
- v0.5: Minor Changes
- Use `size_t' instead of `unsigned long long int'.
- Minor optimizations to the algorithm.
- Added commandline argument parsing.
- v0.6: User Control
- Allow user to choose base in which the prime numbers are printed.
- Give option for primes to be saved to a file upon exit.
- Free memory and leave instead of emergency exit.
- v0.7: Data Saving
- Allow user to save found primes to be loaded later.
- User can save and read primes in raw output.
- v1.0: Parallelization
- Now completely parallelized.
- Cleaned up/organized the code-base
- Exporting files uses less memory
- Allow searching for the nth prime number
- Clearing some memory leaks
- v2.0: Linked List
- Code cleanup.
- Replace OpenMP code with OpenMPI.
- Use linked list for prime storage.

View File

@ -1,39 +0,0 @@
cmake_minimum_required(VERSION 2.6)
project(Indivisible)
cmake_policy(SET CMP0012 OLD)
set(TARGET_NAME indivisible)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug)
endif()
set(CMAKE_MODULE_PATH
${CMAKE_MODULE_PATH}
${CMAKE_SOURCE_DIR}/cmake/)
find_package(GMP REQUIRED)
include_directories(
${GMP_INCLUDE_DIR})
set(SRCS
src/main.c
src/list.c)
# Define the C flags.
set(CMAKE_C_FLAGS "-std=gnu99 -Wall -Wextra -Werror -Wfatal-errors -Wmissing-declarations -pedantic-errors")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g -O0")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -O3")
set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS} -Os")
if(NOT CMAKE_BUILD_TYPE MATCHES Debug AND NOT CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)
add_definitions(-DNDEBUG)
endif()
add_executable(${TARGET_NAME} ${SRCS})
target_link_libraries(${TARGET_NAME}
${GMP_LIBRARY})

View File

@ -1,23 +0,0 @@
Contributing
============
We gladly accept contributions to Indivisible, however there are a few guidelines that must be followed.
1) Copyright & Licensing
------------------------
The copyright of this project and all of its code, unless stated otherwise, belongs to Nicolás Ortega and is licensed with the [GNU GPLv3](/LICENSE). This also applies to all contributions (contributors may add themselves to the [authors file](/AUTHORS.md) for recognition). This is purely for legal purposes, there is no intention to deny your contributions.
2) Documentation
----------------
All new features added must be well documented using DOxygen style comments. If your merge request adds a new feature and it is not well documented we will ask you to finish documenting the code before accepting a merge. This is simply so that both the maintainers of this repo and other users can understand the new API that bas been added.
3) Code-Style
-------------
The only aspects that will be religiously upheld for all contributions to this repo are indentation and bracket placement. All indentation must be tab characters (reason being so that everyone can view the code with the indentation that they prefer rather than being forced to see a specific indentation), and brackets must be attached. Everything else is minor and can be overlooked.
Things that would be nice is if you could avoid having the lines being too long, and please avoid having more than one empty line in a row.
4) Fractured Merge Requests
---------------------------
Please make sure your merge requests are fractured into separate parts so that it may be easy for us to deal with them individually. The reason for this is to avoid having merge requests that both fix bugs and add features when in reality they should be separate requests. The only exception to this will be if the changes made to the code depend on one another to function properly.
If your merge request meets all these requirements and is passed by one of the moderators it will be merged into the main repo.

2489
Doxyfile

File diff suppressed because it is too large Load Diff

View File

@ -631,8 +631,8 @@ to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{one line to give the program's name and a brief idea of what it does.}
Copyright (C) {year} {name of author}
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
{project} Copyright (C) {year} {fullname}
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.

48
Makefile Normal file
View File

@ -0,0 +1,48 @@
# Copyright (C) 2019 Ortega Froysa, Nicolás <nicolas@ortegas.org>
# Author: Ortega Froysa, Nicolás <nicolas@ortegas.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program 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 a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
CC=mpicc
DEBUG=0
PREFIX=/usr/local
INCFLAGS=
LDFLAGS=-lgmp
DEFS=-DVERSION=\"2.0\" -DAPP_NAME=\"Indivisible\"
CFLAGS=$(INCFLAGS) $(DEFS) -std=c99 -Wall -Wextra -Wfatal-errors -Werror
HDRS=src/globals.h src/llist.h
OBJS=src/llist.o src/main.o src/prime_test.o
ifeq ($(DEBUG),1)
CFLAGS+=-g -O0 -DDEBUG
else
CFLAGS+=-O2 -DNDEBUG
endif
%.o:%.c $(HDRS)
$(CC) -c -o $@ $< $(CFLAGS)
indivisible: $(OBJS)
$(CC) -o $@ $^ $(LDFLAGS)
.PHONY: clean distclean install
clean:
$(RM) $(OBJS)
distclean: clean
$(RM) indivisible
install: indivisible
install -m 755 indivisible $(PREFIX)/bin/

34
README Normal file
View File

@ -0,0 +1,34 @@
===================
*** Indivisible ***
===================
A parallelized prime number generator written in C. It uses a bignum
library as well as OpenMPI for parallelization.
# Building
----------
## Dependencies
The dependencies for compiling are minimal, and should be available
on most UNIX-like systems:
- GNU Make
- GNU Multi-Precision Arithmetics Library (GMP)
- OpenMPI
## Compiling
To compile you simply need to run the `make` command, which will
create the `indivisible` binary file. Additionally you can set the
following flags by appending them to the `make` command:
- `DEBUG=<1|0>`: whether to create a debug or release build. (0 by
default)
- `PREFIX=<path>`: what base prefix to install the binaries at.
(`/usr/local` by default)
# Contributing
--------------
To contribute to the project, please follow the same coding style you
see in the current code base. Then, either submit a pull request or send
a patch file to <nicolas@ortegas.org>.
# License
---------
This project is licensed under the terms & conditions of the GNU General
Public License version 3 or greater (see `LICENSE` file).

View File

@ -1,28 +0,0 @@
Indivisible
===========
[![build status](https://gitlab.com/Deathsbreed/Indivisible/badges/master/build.svg)](https://gitlab.com/Deathsbreed/Indivisible/commits/master)
Indivisible is an optimized prime number generator written in C.
Building
--------
There are multiple dependencies to install before compiling the project:
- CMake
- GMP
Once the dependencies are installed you can compile by running the following from the root directory of the project:
```bash
$ cd build/
$ cmake ..
$ make
```
To build a release build run `cmake -DCMAKE_BUILD_TYPE=Release ..` instead.
Contributing
------------
If you would like to contribute to Uhn then please read the [contributing file](/CONTRIBUTING.md) before creating a merge request.
License
-------
This project is licensed with the [GNU GPLv3](/LICENSE). Since it is an educational project I find it very important that all contributions continue to remain free/libre.

View File

@ -1,3 +0,0 @@
--lineend=linux
--indent=tab
--style=attach

View File

View File

@ -1,24 +0,0 @@
# SOURCE: http://stackoverflow.com/questions/29307862/error-linking-gmp-library
set(GMP_PREFIX "" CACHE PATH "path ")
find_path(GMP_INCLUDE_DIR gmp.h gmpxx.h
PATHS ${GMP_PREFIX}/include /usr/include /usr/local/include )
find_library(GMP_LIBRARY NAMES gmp libgmp
PATHS ${GMP_PREFIX}/lib /usr/lib /usr/local/lib)
if(GMP_INCLUDE_DIR AND GMP_LIBRARY)
get_filename_component(GMP_LIBRARY_DIR ${GMP_LIBRARY} PATH)
set(GMP_FOUND TRUE)
endif()
if(GMP_FOUND)
if(NOT GMP_FIND_QUIETLY)
MESSAGE(STATUS "Found GMP: ${GMP_LIBRARY}")
endif()
else()
if(GMP_FIND_REQUIRED)
message(FATAL_ERROR "Could not find GMP")
endif()
endif()

27
src/globals.h Normal file
View File

@ -0,0 +1,27 @@
/*
* Copyright (C) 2019 Ortega Froysa, Nicolás <nicolas@ortegas.org>
* Author: Ortega Froysa, Nicolás <nicolas@ortegas.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#ifndef APP_NAME
#define APP_NAME "app name"
#endif
#ifndef VERSION
#define VERSION "version"
#endif

View File

@ -1,43 +0,0 @@
#include "list.h"
#include <stdlib.h>
#include <stdio.h>
/**
* This is the number of elements by which the list expands.
*/
#define BLOCK_SIZE 1024
void initList(List *restrict l) {
l->list = malloc(sizeof(mpz_t) * BLOCK_SIZE);
if(!l->list) {
fprintf(stderr, "Failed to allocate memory to list!\n");
exit(1);
}
l->size = BLOCK_SIZE;
l->end = 0;
}
void deInitList(List *restrict l) {
for(size_t i = 0; i < l->size; ++i) {
mpz_clear(l->list[i]);
}
free(l->list);
}
void addToList(List *l, mpz_t n) {
if(l->end == l->size) {
l->size += BLOCK_SIZE;
if(l->size == 0) {
fprintf(stderr, "`l->size' has overflowed!\n");
exit(1);
}
void *tmp = realloc(l->list, sizeof(mpz_t) * l->size);
if(!tmp) {
fprintf(stderr, "Failed to allocate more memory to list!\n");
exit(1);
}
l->list = (mpz_t*)tmp;
}
mpz_init(l->list[l->end]);
mpz_set(l->list[l->end++], n);
}

View File

@ -1,42 +0,0 @@
/**
* @file list.h
* @author Deathsbreed <deathsbreed@themusicinnoise.net>
* @brief Code responsible for List management.
* @details Code responsible for the definition and management of the
* List object.
*/
#pragma once
#include <gmp.h>
#include <stdbool.h>
/**
* @brief An infinitely expanding list type.
*/
typedef struct {
mpz_t *list; //!< The list of elements
size_t size; //!< How many elements are in the list
size_t end; //!< The last element of the list (in use)
} List;
/**
* @brief Initialize a List.
* @details Initialize the list and its variables, allocating memory
* to the pointer array inside.
* @param[in] l A pointer to a List type to be initialized.
*/
void initList(List *restrict l);
/**
* @brief Deinitialize a List.
* @details Release all memory that has been allocated to the list.
* @param[in] l A pointer to a List type to be deinitialized.
*/
void deInitList(List *restrict l);
/**
* @brief Adds a new item to a List type.
* @details Add item `n' at the end of a List type.
* @param[out] l List to which the variable should be appended.
* @param[in] n variable to be appended to the list.
*/
void addToList(List *l, mpz_t n);

61
src/llist.c Normal file
View File

@ -0,0 +1,61 @@
/*
* Copyright (C) 2019 Ortega Froysa, Nicolás <nicolas@ortegas.org>
* Author: Ortega Froysa, Nicolás <nicolas@ortegas.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "llist.h"
#include <stdlib.h>
#include <stdio.h>
void llist_init(struct llist *list) {
list->first = NULL;
list->last = NULL;
list->size = 0;
}
void llist_deinit(struct llist *list) {
struct llist_item *aux = list->first;
while(aux)
{
mpz_clear(aux->n);
struct llist_item *tmp = aux;
aux = aux->next;
free(tmp);
}
}
int llist_insert(struct llist *list, mpz_t n) {
struct llist_item *aux =
malloc(sizeof(struct llist_item));
if(!aux)
{
fprintf(stderr, "ERROR llist_insert(): failed to allocate memory");
return 0;
}
aux->prev = list->last;
aux->next = NULL;
// TODO: check time complexity of these GMP functions
mpz_init(aux->n);
mpz_set(aux->n, n);
if(!list->first)
list->first = aux;
list->last = aux;
list->size++;
return 1;
}

57
src/llist.h Normal file
View File

@ -0,0 +1,57 @@
/*
* Copyright (C) 2019 Ortega Froysa, Nicolás <nicolas@ortegas.org>
* Author: Ortega Froysa, Nicolás <nicolas@ortegas.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <gmp.h>
struct llist_item {
mpz_t n; // the number stored
struct llist_item *next; // the next element in the list
struct llist_item *prev; // the previous element in the list
};
struct llist {
struct llist_item *first; // first element of the list
struct llist_item *last; // last element of the list
size_t size; // number of elements in the list
};
/*
* initialize an empty linked list where `first` and `last` are
* equal to NULL and `size` is 0.
*/
void llist_init(struct llist *list);
/*
* free all space allocated to the list.
*/
void llist_deinit(struct llist *list);
/*
* insert an item at the end of the linked list with value `n`.
*
* returns 1 on success, 0 on failure.
*/
int llist_insert(struct llist *list, mpz_t n);
/*
* insert an item in the linked list in a sorted position.
*
* returns 1 on success, 0 on failure.
*/
int llist_sorted_insert(struct llist *list, mpz_t n);

View File

@ -1,125 +1,70 @@
#include <stdio.h>
#include <stdlib.h>
/*
* Copyright (C) 2019 Ortega Froysa, Nicolás <nicolas@ortegas.org>
* Author: Ortega Froysa, Nicolás <nicolas@ortegas.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "globals.h"
#include "llist.h"
#include "prime_test.h"
#include <signal.h>
#include <stdbool.h>
#include <getopt.h>
#include <stdio.h>
#include <gmp.h>
#include "list.h"
int run = 1;
#define VERSION "v0.5"
void quit_signal(int signum) {
printf("Received signal %d. Ending process...\n", signum);
run = 0;
}
static bool run;
int main() {
printf("%s v%s\n", APP_NAME, VERSION);
void printUsage(char *progName);
void leave();
signal(SIGINT, quit_signal);
int main(int argc, char *argv[]) {
bool f_help = false, f_version = false, f_quiet = false;
mpz_t test_base; // number used to get tested numbers
mpz_t p0, p1; // numbers to be tested for prime-ness.
int c;
while((c = getopt(argc, argv, "hvq")) != -1) {
switch(c) {
case 'h':
f_help = true;
break;
case 'v':
f_version = true;
break;
case 'q':
f_quiet = true;
break;
default:
printUsage(argv[0]);
exit(1);
mpz_inits(test_base, p0, p1, NULL);
mpz_set_ui(test_base, 6); // test_base = 6*k
puts("2");
puts("3");
while(run)
{
mpz_sub_ui(p0, test_base, 1); // p0 = test_base - 1
mpz_add_ui(p1, test_base, 1); // p0 = test_base + 1
if(test_prime(p0))
{
mpz_out_str(stdout, 10, p0);
printf("\n");
}
}
if(f_help) {
printUsage(argv[0]);
puts(" -h print this help information");
puts(" -v print version number of program");
puts(" -q quiet mode");
return 0;
} else if(f_version) {
printf("Indivisible %s\n", VERSION);
return 0;
}
// Quit on ^C by setting `run = false'
run = true;
signal(SIGINT, leave);
if(f_quiet) {
puts("Use Ctrl+C (SIGINT) to exit.");
}
// Primes we've found
List primes;
initList(&primes);
// The number we're going to be testing for
mpz_t num;
mpz_init(num);
// Add 2, a known prime to this list
mpz_set_ui(num, 2);
addToList(&primes, num);
if(!f_quiet) {
if(mpz_out_str(stdout, 10, num) == 0) {
fprintf(stderr, "Could not print to `stdout'!\n");
exit(1);
}
printf("\n");
}
mpz_add_ui(num, num, 1);
// Variable for half `num'
mpz_t halfNum;
mpz_init(halfNum);
do {
// Calculate half of `num'
mpz_fdiv_q_ui(halfNum, num, 2);
/**
* Loop through primes we've found until we get to half of the number
* we're analyzing
*/
for(size_t i = 0; mpz_cmp(primes.list[i], halfNum) < 0; ++i) {
// If `num' is divisible by a prime then go to the next number
if(mpz_divisible_p(num, primes.list[i]) != 0)
goto nextPrime;
}
// `num' is a prime so we add it to the list and print it
addToList(&primes, num);
if(!f_quiet) {
if(mpz_out_str(stdout, 10, num) == 0) {
fprintf(stderr, "Could not print to `stdout'!\n");
exit(1);
}
if(test_prime(p1))
{
mpz_out_str(stdout, 10, p1);
printf("\n");
}
nextPrime:
// Add 2 (skip even numbers since they're all divisible by 2)
mpz_add_ui(num, num, 2);
} while(run);
mpz_add_ui(test_base, test_base, 6); // k += 1
}
printf("Found %zu primes.\n", primes.end);
puts("Clearing memory...");
// Clear GMP variables
mpz_clear(halfNum);
mpz_clear(num);
// Deinitialize the list
deInitList(&primes);
mpz_clears(test_base, p0, p1, NULL);
puts("Exit successful.");
return 0;
}
void printUsage(char *progName) {
printf("%s [-v | -h | -q]\n", progName);
}
void leave() { run = false; }

39
src/prime_test.c Normal file
View File

@ -0,0 +1,39 @@
/*
* Copyright (C) 2019 Ortega Froysa, Nicolás <nicolas@ortegas.org>
* Author: Ortega Froysa, Nicolás <nicolas@ortegas.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "prime_test.h"
int test_prime(const mpz_t p) {
mpz_t psqrt;
mpz_t aux;
mpz_inits(psqrt, aux, NULL);
mpz_sqrt(psqrt, p);
int is_prime = 1;
for(mpz_set_ui(aux, 5); mpz_cmp(aux, psqrt) <= 0; mpz_add_ui(aux, aux, 2))
{
if(mpz_divisible_p(p, aux))
{
is_prime = 0;
break;
}
}
mpz_clears(psqrt, aux, NULL);
return is_prime;
}

27
src/prime_test.h Normal file
View File

@ -0,0 +1,27 @@
/*
* Copyright (C) 2019 Ortega Froysa, Nicolás <nicolas@ortegas.org>
* Author: Ortega Froysa, Nicolás <nicolas@ortegas.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <gmp.h>
/*
* checks to see if the number `p` is prime, returning 1 if it is and 0
* if it is not.
*/
int test_prime(const mpz_t p);