Premier cours

publicité
Vers C++ venant
de C et de Java
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
Vers C++ venant de C et de Java
Adrien Poteaux et Alexandre Sedoglavic
Licence 3 info
Université de Lille 1
Janvier 2015
Vers C++ venant
de C et de Java
Généralités
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
Le C++ est un langage de programmation développé à
partir de 1980 par Bjarne Stroustrup.
Nous utiliserons la normalisation iso 2011 de ce langage
compilé.
Ce langage se veut une incrémentation du langage C (bien
que l’inclusion de l’un dans l’autre ne soit pas stricte).
Le C++ est moins efficace que C mais plus que Java.
C++ est un langage compilé qui permet la programmation
procédurale et la poo.
Vers C++ venant
de C et de Java
Adrien Poteaux et
Alexandre
Sedoglavic
Ce qui marche en C mais pas en C++
La conversion implicite est plus stricte en C++. Ainsi, pour
les pointeurs de type void par exemple :
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
const int *j = NULL ;
/* marche en C mais pas en C++ */
int *i = malloc(sizeof(int)) ; i=j ;
//marche dans les 2 langages
int *i = (int *) malloc(sizeof(int)) ;
I
pas de goto du C en C++ ;
I
les énumérations ne sont pas des int en C++ ;
I
en C++ la fonction int foo() ne prend par
d’arguments alors qu’en C elle en prend un nombre
indéterminé ;
I
impossible d’utiliser les identificateurs de C++ dans un
code C compilé par un compilateur C++.
Vers C++ venant
de C et de Java
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
Pointeurs et références
C++ introduit — en plus des pointeurs classiques — la
notion de référence :
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
int i ;
int &refsuri = i;
I
un pointeur est une variable pouvant être modifié, la
référence est une adresse non modifiable ;
I
pas d’arithmétique des références comme il y a une
arithmétique des pointeurs ;
I
un pointeur peut pointer sur 0 alors qu’en théorie une
référence est toujours l’adresse d’un object existant ;
I
la référence se comporte comme un alias de ce à quoi
elle fait référence.
Vers C++ venant
de C et de Java
Exemple du swap
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
void myswap(int & a, int & b)
{
int c = a ;
a=b ;
b=c ;
}
int main (void)
{
int k = 5, e = 4 ;
myswap(k,e) ;
return k-4 ;
}
Noter bien les paramètres et les arguments de la fonction
myswap dans l’exemple ci-dessus.
Vers C++ venant
de C et de Java
Espaces de noms
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
Le mécanisme des espaces de noms (namespace en anglais)
permet de résoudre les ambiguı̈tés de plusieurs variables
homonymes provenant de di↵érents composants.
L’opérateur de résolution de portée :: permet de recourir à
une fonction d’un espace de nom.
#include<iostream>
int main(void){
std::cout << "Hello, new world!\n"
<< std::endl ; // second saut de ligne
return 0 ;
}
Vers C++ venant
de C et de Java
Directive using
Adrien Poteaux et
Alexandre
Sedoglavic
Un espace de noms précis à utiliser peut être spécifier afin
d’éviter le recour à la résolution de portée.
Introduction
#include <iostream>
using namespace std;
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
int main(void) {
cout << "Hello, new world !" << endl ;
return 0 ;
}
De même :
#include <iostream>
Schéma à seuil de
Shamir
int main(void) {
using std::cout;
cout << "Hello, new world !"
<< std::endl; // r\’esolution pour endl
}
Vers C++ venant
de C et de Java
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
Construction d’un espace de noms
#include <iostream>
using namespace std;
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
namespace first{
int x = 5; int y = 10;
}
namespace second{
double x = 3.1416; double y = 2.7183;
}
int main (void) {
using first::x; using second::y;
cout << x << " " << y << endl ;
cout << second::x << " " << first::y << ’\n’;
return 0;
}
Vers C++ venant
de C et de Java
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Modèles
Les modèles (templates en anglais) autorisent l’écriture d’un
code sans considération envers le type des données qu’il
manipulera.
Programmation
génériques
Il s’agit d’une alternative aux macros préprocesseur du
langage C ; par exemple, la macro :
Les fondements
implantés
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
peut être remplacée en C++ par le modèle de fonction :
template <typename T>
T min (const T &x, const T &y)
{ return (x<y)? x:y; }
Cela s’applique aussi bien les fonctions que les structures, les
unions ou les classes.
Vers C++ venant
de C et de Java
Adrien Poteaux et
Alexandre
Sedoglavic
Exemple simple
L’implantation générique du swap est :
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
template <typename T>
void swap ( T& a, T& b )
{
T c; c=a; a=b; b=c;
}
int main(void)
{
int i=5,j=4 ;
float k=3.14, e=2.71 ;
swap(i,j) ; swap(k,e) ;
return (i-4) + (k-2.71) ;
}
Vers C++ venant
de C et de Java
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
Exemple un peu plus complexe
template< typename A, typename B, int N, int M>
struct foo
{
A tab[N] ;
B tib[M] ;
} ;
int main(void)
{
foo<float,int,2,3> var ;
// contrairement \‘a C pas besoin
// de struct foo dans la d\’eclaration
return 0 ;
}
Plus généralement, C++11 introduit les templates
variadiques qui, comme les fonctions variadiques de C,
supporte un nombre variable de paramètres.
Vers C++ venant
de C et de Java
Paramètres des templates
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Les paramètres peuvent être de di↵érentes sortes :
I
types simples : class, struct, types élémentaires comme
int, float, etc. ;
I
constantes scalaires (int, long, bool), mais pas double
ou float ;
I
pointeurs ou références si leur valeur soit définie à
l’édition de liens ;
I
membre d’une classe, dont le type et la classe doivent
être aussi passés en paramètres du template ;
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
La définition d’un template peut être passée à un template,
ce qui permet notamment de s’appuyer sur la définition
abstraite, par exemple, d’un conteneur.
Vers C++ venant
de C et de Java
C++ Strandard Library
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
La bibliothèque standard du C++ est constituée de classes
et de fonctions standardisées fournissant des outils
(généralement sous forme de partrons) comme :
I
des types (e.g. pour manipuler efficacement des chaı̂nes
de caractères std::string) ;
Les fondements
implantés
I
des outils de manipulation de flux (e.g. fichiers, etc.) ;
Outils standards
Outils de calcul
niveau processeur
I
des conteneurs facilitant la manipulation d’objets de
même type (e.g. insertion, retrait d’élément comme
std::vector) ;
I
des algorithmes de bas niveau (e.g. le tri).
Programmation
génériques
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
L’ensemble de la bibliothèque spécifié par la norme iso est
accessible via l’espace de noms std.
Vers C++ venant
de C et de Java
Les librairies de calculs machine
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
I
gnu MultiPrecision, également appelée gmp, est une
bibliothèque logicielle de calcul multiprécision sur des
nombres entiers, rationnels et en virgule flottante.
Les principaux domaines d’applications de gmp sont la
recherche et les applications en cryptographie, les
logiciels applicatifs de sécurité pour Internet et les
systèmes de calcul formel.
I
gnu mpfr (multiprecision floating point computations
with correct rounding) est une bibliothèque portable C
de calcul arithmétique multiprécision en virgule flottante
avec arrondi correct. C’est un logiciel libre basé sur
gmp.
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
Vers C++ venant
de C et de Java
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
Exemple gmp
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
int main(void){
mpz_t x, y, result;
mpz_init(x); mpz_init(y); mpz_init(result);
mpz_set_str(x, "7612058254738945", 10);
mpz_set_str(y, "9263591128439081", 10);
mpz_mul(result, x, y);
gmp_printf("\n %Zd * %Zd = %Zd \n"
,x, y, result);
mpz_clear(x); mpz_clear(y); mpz_clear(result);
return 0;
} /*
Vers C++ venant
de C et de Java
Une interface C++ existe
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
#include <iostream>
#include <gmpxx.h>
int main()
{
mpz_class x("7612058254738945");
mpz_class y("9263591128439081");
Exemples :
structures
algèbriques
std::cout << "\n
" << x << "\n*\n
" << y;
std::cout << "\n--------------------\n"
<< x * y << "\n\n";
return 0;
Schéma à seuil de
Shamir
}
Vers C++ venant
de C et de Java
Adrien Poteaux et
Alexandre
Sedoglavic
Exemple mpfr
Pour calculer avec 200 décimales (binaires) de précisions :
100
X
1
.
i!
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
i=1
#include <stdio.h>
#include <gmp.h>
#include <mpfr.h>
int main (void){
unsigned int i;
mpfr_t s, t, u;
mpfr_init2 (t, 200); mpfr_set_d (t, 1.0, MPFR_RNDD);
mpfr_init2 (s, 200); mpfr_set_d (s, 1.0, MPFR_RNDD);
mpfr_init2 (u, 200);
for (i = 1; i <= 100; i++){
mpfr_mul_ui (t, t, i, MPFR_RNDU);
mpfr_set_d (u, 1.0, MPFR_RNDD);
mpfr_div (u, u, t, MPFR_RNDD);
mpfr_add (s, s, u, MPFR_RNDD);
}
printf ("Sum is ");
mpfr_out_str (stdout, 10, 0, s, MPFR_RNDD);
putchar (’\n’);
mpfr_clear (s); mpfr_clear (t); mpfr_clear (u);
return 0;
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
}
Vers C++ venant
de C et de Java
Groupe
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
Un groupe G est un ensemble muni d’une loi de composition
interne + satisfaisant les axiomes suivants :
I
I
I
la loi est
associative 8(a, b, c) 2 G 3 , (a + b) + c = a + (b + c) ;
il existe e un élément
neutre 8a 2 G , a + e = e + a = a ;
pour tout élément a de G , il existe un élément
symétrique b, i.e. a + b = b + a = e.
Vers C++ venant
de C et de Java
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
Anneau
Un anneau A est un ensemble muni de 2 lois de composition
internes (disons + et ·) telles que :
I
pour tous éléments a, b et c de A on a :
De C vers C++
Pointeurs et
références
Espaces de noms
(a + b) + c = a + (b + c),
(a · b) · c = a · (b · c), a + b = b + a,
a · (b + c) = a · b + a · c, idem sur la droite.
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
I
I
I
L’anneau est commutatif si a · b = b · a.
Il existe un élément 0 (resp. 1) neutre pour la loi +
(resp. ·).
Tout élément a de A possède un opposé
(i.e. a + a = 0).
a
L’anneau est intègre s’il n’a pas de diviseur de 0 :
8(a, b) 2 A2 ,
a · b = 0 ) (a = 0 ou b = 0).
Vers C++ venant
de C et de Java
Algorithme d’exponantiation rapide
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
1:
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
2:
3:
4:
Les fondements
implantés
5:
Outils standards
Outils de calcul
niveau processeur
6:
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
7:
8:
9:
10:
11:
12:
function ExponantiationRapide(a, n)
. calcule a
puissance n
if n = 0 then return 1
end if
r
1, s
a
while n 6= 0 do
. Condition de fin
if n mod 2 6= 0 then r
r ⇥s
end if
s
s ⇤s
n
n/2
end while
return r
end function
Vers C++ venant
de C et de Java
Algorithme d’Euclide étendu
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
1:
De C vers C++
2:
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function EuclidEtendu(a, b) . Le p.g.c.d. de a et b
if b = 0 then return a, 1, 0
end if
u1
0, v1
1, u2
1, v2
0
while b 6= 0 do
. Condition de fin
q
a ÷ b, r
a mod b
x
u2 qu1 , y
v2 qv1
a
b, b
r , u2
u 1 , v2
v1
u1
x, v1
y
end while
return a, u2 , v2
end function
Vers C++ venant
de C et de Java
Corps commutatif
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
Un corps F est un ensemble muni de 2 lois de composition
internes (disons + et ·) telles que :
I
(F, +) forme un groupe abélien dont l’élément neutre
est 0 ;
I
(F \ {0}, ·) forme un groupe abélien dont l’élément
neutre est 1 ;
I
la loi · est distributive pour la loi + (à gauche comme à
droite).
Vers C++ venant
de C et de Java
Exemples
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
L’ensemble des rationnels Q est un corps commutatifs.
Les entiers modulo un nombre premier forment un corps
commutatifs fini.
L’anneau des entiers Z et et l’anneau des polynômes
univariés à coefficients rationnels Q[t] sont des anneaux
commutatifs intègres Euclidien.
Vers C++ venant
de C et de Java
Principe
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
L’objectif est de diviser n + 1 données (ai )0in , en ⇢
parties (Pi )0in de façons à ce que :
I
la connaissance d’au moins n + 1 parties rend le calcul
des données facile ;
I
la connaissance de strictement moins de n + 1 parties
rend le calcul des données impossibles.
Sachant que pour un polynôme
f (x) = a0 + a1 x + a2 x 2 + · · · + an x n .
il suffit de n + 1 points (xi , f (xi ))1in+1 pour reconstruire
ce polynôme de degré n, l’interpolation polynomiale permet
une implantation aisé du principe ci-dessus.
Vers C++ venant
de C et de Java
Adrien Poteaux et
Alexandre
Sedoglavic
Introduction
De C vers C++
Pointeurs et
références
Espaces de noms
Programmation
génériques
Les fondements
implantés
Outils standards
Outils de calcul
niveau processeur
Exemples :
structures
algèbriques
Schéma à seuil de
Shamir
Formule d’interpolation de Lagrange
Soit (xi , yi )1in+1 , une liste de n + 1 points (les xi
désignent les abscisses et les yi désignent les ordonnées).
L’interpolation de Lagrange permet de calculer l’unique
polynôme f de degré n + 1 tel que yi = f (xi )
pour 1  i  n + 1.
Pour chaque point (xi , yi ) on construit un polynôme i tel
que i (xi ) = yi et i (xj ) = 0 pour 1  i 6= j  n. On
cherche une solution de la forme :
i (x)
= Qn
yi
j =1
j 6= i
La somme des polynômes
(xi
i
f (x) =
xj )
n
Y
(x
xj ).
j =1
j 6= i
fournit le polynôme f recherché.
n
X
i=1
yi
i (x).
Téléchargement