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 )0in , en ⇢ parties (Pi )0in 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 ))1in+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 )1in+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).