Programowanie w systemie UNIX/FLINT
Wygląd
FLINT = Fast Library for Number Theory[1]
Instalacja
[edytuj]zależności
[edytuj]git
[edytuj]Instalujemy wersję rozwojową[3]
git clone git://github.com/wbhart/flint2.git flint2 cd flint2 make make check sudo make install
Sprawdzamy:
~/flint2$ git branch * trunk
uaktualniamy
git pull
doc
[edytuj]~/flint2$ cd doc/latex make
apt
[edytuj]sudo apt-get install libflint-dev # nie testowane
lokalizacja bibliotek
[edytuj]sudo updatedb locate libflint
przykładowy wynik:
/home/a/flint2/libflint.a /home/a/flint2/libflint.so /home/a/flint2/libflint.so.13 /home/a/flint2/libflint.so.13.5.2 /usr/local/lib/libflint.a /usr/local/lib/libflint.so /usr/local/lib/libflint.so.13 /usr/local/lib/libflint.so.13.5.2
biblioteka jest zainstalowana w:
/usr/local/lib/
lokalizacja plików nagłówkowych
[edytuj]locate flint.h
Przykładowy wynik:
~/flint2/flint.h /usr/local/include/flint/flint.h
Ścieżka wyszukiwania bibliotek
[edytuj]echo $LD_LIBRARY_PATH
ustawiamy (czasowo):
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
lub na stałe przez wpis (jako root) w pliku[4]
/etc/ld.so.conf.d/*.conf
Typy
[edytuj]- całkowite
- slong = (ang. signed long) zamiast long lub long long (w celu przenośności = niezależności od platformy sprzętowej)
- ulong = (ang. unsigned long) ulong lub ulong long (w celu przenośności = niezależności od platformy sprzętowej)
- fmpz_t = typ całkowity o dowolnej precyzji
- wektorowe
- fmpz vec = typ wektorowy całkowity. Dla wektora liczb całkowitych o dowolnej precyzji
- rzeczywiste
- fmpq_t = typ rzeczywisty (rational numbers) jako ułamki liczb całkowitych o dowolnej precyzji
flint_printf("%wu", d); /* print ulong */
flint_printf("%wd", d); /* print slong */
Przykłady
[edytuj]Pierwszy program
[edytuj]/*
gcc f.c -lflint -lgmp -lmpfr -lpthread -Wall
export LD_LIBRARY_PATH=/usr/local/lib/
*/
#include <gmp.h>
#include <mpfr.h>
#include <flint/flint.h>
int main ( void )
{
flint_printf (" MPFR-%s \n GMP-%s \n Flint-%s\n", mpfr_version, gmp_version, FLINT_VERSION );
return 0;
}
Przykładowy wynik:
MPFR-3.1.5 GMP-6.1.1 Flint-2.5.2
liczby całkowite
[edytuj]/*
gcc c.c -lflint -lgmp -lmpfr -lpthread -Wall
export LD_LIBRARY_PATH=/usr/local/lib/
*/
#include <gmp.h>
#include <mpfr.h>
#include <flint/flint.h>
#include <flint/fmpz.h>
int main ( void )
{
fmpz_t x , y ;
// init
fmpz_init ( x ) ;
fmpz_init ( y ) ;
// set
fmpz_set_ui (x , 7) ;
fmpz_mul (y , x , x ) ;
// print
fmpz_print ( x ) ;
flint_printf ( " ^2 = " ) ;
fmpz_print ( y ) ;
flint_printf ( " \n" ) ;
flint_printf (" MPFR-%s \n GMP-%s \n Flint-%s\n", mpfr_version, gmp_version, FLINT_VERSION );
// clear
fmpz_clear ( x ) ;
fmpz_clear ( y ) ;
return 0;
}
Wynik :
gcc c.c -lflint -lgmp -lmpfr -lpthread -Wall
./a.out
7 ^2 = 49
MPFR-3.1.5
GMP-6.1.1
Flint-2.5.2
primegen
[edytuj]Program wyświetla lub liczy liczby pierwsze mniejsze niż podana liczba.
Jest to przykładowy program z biblioteki flint. Kod źródłowy znajduje się w pliku:
~/flint2/examples/primegen.c
skompilowana wersja :
~/flint2/build/examples/primegen
Możemy samodzielnie skompilować program po wprowadzeniu kilku zmian :
/*
Copyright (C) 2012 Fredrik Johansson
This file is part of FLINT.
FLINT is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License (LGPL) as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. See <http://www.gnu.org/licenses/>.
gcc primegen.c -lflint -lgmp -lmpfr -lpthread -Wall
export LD_LIBRARY_PATH=/usr/local/lib/
*/
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <flint/flint.h> // change
#include <flint/ulong_extras.h> // change
int main(int argc, char* argv[])
{
n_primes_t iter;
mp_limb_t p, N;
if (argc < 2)
{
flint_printf("primegen N - print all primes <= N\n");
flint_printf("primegen -c N - generate the primes but just count them\n");
return EXIT_FAILURE;
}
N = strtoul(argv[argc-1], NULL, 10);
if (N == UWORD_MAX)
{
flint_printf("N must be smaller than %wu\n", UWORD_MAX);
return EXIT_FAILURE;
}
if (argc == 3)
{
ulong count = 0;
n_primes_init(iter);
while ((p = n_primes_next(iter)) <= N)
count++;
n_primes_clear(iter);
flint_printf("pi(%wu) = %wu\n", N, count);
}
else
{
n_primes_init(iter);
while ((p = n_primes_next(iter)) <= N)
flint_printf("%wu\n", p);
n_primes_clear(iter);
}
return EXIT_SUCCESS;
}
wynik:
./a.out
primegen N - print all primes <= N
primegen -c N - generate the primes but just count them
./a.out 100
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
./a.out -c 100
pi(100) = 25
Pomoc
[edytuj]- plik pdf
- grupy dyskusyjne Google
- flint-devel
- flint
video
[edytuj]- Video of the talk Parallel Computation in Number Theory (January 30, 2007) by William Hart
- Video of the talk FLINT and Fast Polynomial Arithmetic (June 13, 2007) By David Harvey
- Video of the talk A short talk on short division (October 1, 2007) by William Hart
- Video of the talk Algebraic Number Theory with FLINT (November 11, 2007) by William Hart