Mathématiques

Portrait de trax

Régression Linéaire

Suite à un cours de math je me suis qu'il pourrait être intéressant d'implémenter un algorithme de regression linéaire histoire de mieux s'en rappeler (je suis sur qu'il existe pleins d'autres implémentations bien meilleurs). Celle-ci est volontairement non optimisée pour rester le plus lisible possible

Le code suivant charge un fichier sous la forme : "valX valY" (voir bas de page pour une code exemple). Le résultat peut être vérifié grâce gnuplot qui propose aussi une implémentation de cette algorithme.

#include <stdio.h>
#include <assert.h>
Domaine: 
Portrait de trax

Test de Rabbin Miller (nombre premier)

Petit code effectuant le test de Rabbin-Miller utilisant la librairie de calcul gmp

static int rabbin(int a_, mpz_t p){
 
	mpz_t temp;
	mpz_t r;
	mpz_t a;
	mpz_t q;
	mpz_t pm;
	mpz_t i;
 
	int moinsUn = 0;
 
	mpz_init(temp);
 
	mpz_init_set(r,p);
	mpz_init_set(pm,p);
	mpz_sub_ui(pm,pm,1);
	mpz_init_set_ui(a,a_);
	mpz_init_set_ui(q,0);
 
 
	mpz_sub_ui(r,r,1);
	do{
		mpz_cdiv_q_2exp(r,r,1);
		mpz_mod_ui(temp, r, 2);
		mpz_add_ui(q,q,1);
	}while (mpz_cmp_ui(temp,0) == 0);
	/**
	 * Nous avons q = r2^{pp}
	*/
Domaine: 
Portrait de furet

calcul d'une racine carrée

/**
* \file square_root.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
/**
* \def EPSI est la précision recherchée
*/
 
#define EPSI 1.e-6
 
/**
* \brief Algorithme de Newton pour calculer une racine carrée.
* Utilise une boucle do while pour calculer la racine. Deux conditions de sortie de boucle :
* 1 L'erreur comise est <= à EPSI
* 2 Le nombre max d'itérations est atteind.
* NB : Aucun renseignement n'est donné quant à la condition de sortie réalisée ;
* la fonction n'indique pas si e <= EPSI en fin de boucle.
Domaine: 
Portrait de trax

Calcul rapide de puissance de 2

Ce qu'il ne faut pas faire

Encore une fois, il y a la méthode > (private joke inside) qui consiste à faire une boucle du genre :

int puissance2(int puissance){
	unsigned int resultat = 1;
	for (int i = 0 ; i<puissance ; i++){
		resultat *= 2;
	}
	return resultat;
}

Temps d'execution: o(puissance)

C'est moche... Pourquoi c'est moche ? Parce que le programme effectue pour calculer 2^n, n multiplication. Temps moyen par multiplication : 5 à 6 cycles d'horloges, soit n*6 ça peut faire beaucoup).

Domaine: 
Portrait de trax

Tester si un nombre est premier

Calcul de nombres premiers

Petit test de primalité d'un unsigned long long int (sur x86 archi 32bits cela donne un nombre entre 0 et 18446744073709551616). Un exemple de code sera posté, utilisant la librairie gmp pour des nombres plus grands.

Nous utilisons ici la méthode dite "naïve" qui conciste à calculer les modulos successifs de tous les nombres impairs de 3 à la racine du nombre en question, après avoir testé si le nombre est divisible par 2.

Domaine: