/***********************************************
 Fichier exemple didapage AAM  modulo 3.cpp
		Le mardi 12 avril 2007
compilable avec C++ de Borland version 4.5
************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#define modulo 3
#define NB_LIGNE modulo
#define NB_COLONNE  (modulo * modulo)

short int ** tab_coeff_poly;
short int entree_t_1,sortie_t_1,entree_t,sortie_t ;
int a_boite_externe, b_boite_externe, c_boite_externe;
int colonne,colonneplus1;
int a_t,b_t,c_t,a_tplus1,b_tplus1, c_tplus1;
int compteur_boucle = 0 ;

typedef int T_FONC (int x, int colonne);
/* les coefficients du polynome de l'AAM sont un vecteur colonne du tableau des coefficients des polynomes */
	T_FONC polynome {
		int resultat;
		resultat= (tab_coeff_poly[0][colonne]*x*x + tab_coeff_poly[1][colonne]*x + tab_coeff_poly[2][colonne])% modulo;
		return resultat;
		}

/* le polynome de la boite externe */
	int boite_externe (int entree)
	{
	int sortie ;
	sortie = (a_boite_externe * entree * entree + b_boite_externe * entree + c_boite_externe) % modulo;
	return (sortie);
	}

/* initialisation du tableau des coefficients des polynomes */
	void initialise_tab_coeff_poly (short int ** tab){
		tab[0][0]=2;tab[0][1]=1;tab[0][2]=2;tab[0][3]=1;tab[0][4]=2;tab[0][5]=0;
		tab[1][0]=2;tab[1][1]=0;tab[1][2]=0;tab[1][3]=0;tab[1][4]=1;tab[1][5]=0;
		tab[2][0]=2;tab[2][1]=2;tab[2][2]=0;tab[2][3]=2;tab[2][4]=1;tab[2][5]=1;

						tab[0][6]=0;tab[0][7]=0;tab[0][8]=0;
						tab[1][6]=1;tab[1][7]=0;tab[1][8]=2;
						tab[2][6]=1;tab[2][7]=2;tab[2][8]=1;
		return;
		}

/* affichage du tableau */
	void print_tab_coeff_poly (short int ** tab){
		short int i,j;
		for(i=0;i<NB_LIGNE;i++){
			printf("\n         ");
			for(j=0;j<NB_COLONNE;j++){
				 printf(" %hd ",tab[i][j]);
				 }
			printf(" \n");
			}
		return;
		}

/* calcul de la colonne du tableau a partir de la valeur d'entree et de sortie de l'AAM */
	int fait_colonne (int entree, int sortie){
		int colonne;
		colonne = 3*entree + sortie;
		return colonne;      }




  int main(){
		  char c = 'a' ;
		  short int i;
		  time_t t;
		  srand((unsigned) time(&t));
		  randomize();

/* programme eviter les erreurs */
		  tab_coeff_poly=(short int**)malloc(NB_LIGNE * sizeof(short int*));
		  if(tab_coeff_poly==NULL){
			  printf("Pb allocation dynamique tab_coeff_poly \n");
			  exit(0);
			  }
		  for(i=0;i<NB_LIGNE;i++){
				tab_coeff_poly[i]=(short int *)malloc(NB_COLONNE * sizeof(short int));
				if(tab_coeff_poly[i]==NULL){
					printf("Pb allocation dynamique tab_coeff_poly[%hd] \n",i);
					exit(0);
					}
				}

		  /* on initialise le tableau des coefficients des polynomes et entree_t_1 et sortie_t_1 */
				printf ("-------------------- initialisation ---------------------------- \n");
				initialise_tab_coeff_poly(tab_coeff_poly);
				printf (" tableau initial des coefficients des polynomes : \n  ");
				print_tab_coeff_poly(tab_coeff_poly);
				entree_t_1 = 2;
				sortie_t_1 = 0;
				printf (" \n entree_t_1 = %d, sortie_t_1 = %d \n",entree_t_1, sortie_t_1 );
				a_boite_externe = 2;
				b_boite_externe = 0;
				c_boite_externe = 1;
				printf (" les coefficients a, b et c du polynome de la boite externe sont %d, %d, %d \n",
					  a_boite_externe, b_boite_externe, c_boite_externe);
				printf ("TAPER N'IMPORTE QUELLE TOUCHE POUR PASSER AU POINT SUIVANT ET 'n' POUR ARRETER \n");
            c=getch();
			/* boucle jusqu'a ce qu'on tape un "n"  */
			while (c  != 'n')
			{
				printf (" \n -------------------- point numero %d ---------------------------- \n", compteur_boucle);
				compteur_boucle++ ;
				colonne = fait_colonne (entree_t_1, sortie_t_1)  ;
				printf (" entree_t_1 = %d, sortie_t_1 = %d   -> ",entree_t_1, sortie_t_1 );
				printf (" colonne = %d \n ", colonne);
			/* l'entree de la boite externe est sortie_t_1
				la sortie de la boite externe est entree_t  */
				entree_t = boite_externe (sortie_t_1);

			/* l'colonne est le numero de colonne du tableau ou l'on va chercher
			les coefficients du polynome du polynome au temps t */
				sortie_t = polynome (entree_t, colonne);    /* premier argument entree, deuxieme colonne     */
				printf ("entree_t   = %d, sortie_t   = %d   -> ",entree_t, sortie_t );

			/* coefficients du polynome n  */
				a_t = tab_coeff_poly [0][colonne];
				b_t = tab_coeff_poly [1][colonne];
				c_t = tab_coeff_poly [2][colonne];
				printf ("coefficients du polynome t \n");
				printf ("                                        (colonne %d): %d, %d, %d \n",colonne, a_t, b_t, c_t);


			 /* report des valeurs pour le point suivant de l'AAM */
				entree_t_1 = entree_t;
				sortie_t_1 = sortie_t;

			 c = getch();
			}
         printf ("\n -------------------- fin de la boucle ---------------------------- \n");
	return 0;
	}


