/*************************************************************************************************************************************/ /* */ /* R E C H E R C H E D E P O I N T S R A T I O N N E L S S U R U N E C O U R B E E L L I P T I Q U E : */ /* */ /* */ /* Author of '$xtc/CourbesElliptiques.01$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20211122110528). */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" #include "CourbesElliptiques.01.I" /* Definition du polynome : */ /* */ /* 3 2 1 0 */ /* A.x + B.x + C.x + D.x */ /* */ #define XnD \ (-10) #define XnA \ (+10) #define XdD \ (+1) #define XdA \ (+10) #define YnD \ (-10) #define YnA \ (+10) #define YdD \ (+1) #define YdA \ (+10) #define NOMBRE \ MAX2(((XnA-XnD+1)*(XdA-XdD+1)),((YnA-YnD+1)*(YdA-YdD+1))) #define factorisation(a,b) \ { \ int racine_carree=(int)sqrt((double)a); \ int diviseur_courant=2; \ int nombre_de_facteurs=0; \ \ while (diviseur_courant <= racine_carree) \ { \ if ((a%diviseur_courant) == 0) \ { \ a = a/diviseur_courant; \ nombre_de_facteurs++; \ if ((b%diviseur_courant) == 0) \ { \ b = b/diviseur_courant; \ pgcd_courant = pgcd_courant*diviseur_courant; \ } \ else \ { \ } \ } \ else \ { \ diviseur_courant++; \ } \ } \ \ if (nombre_de_facteurs == 0) \ { \ } \ else \ { \ } \ } int pgcd(x,y) int x,y; { int Ax=ABSO(x); int Ay=ABSO(y); int Vx; int Vy; int pgcd_courant=1; Vx=Ax; Vy=Ay; factorisation(Ax,Ay); factorisation(Ay,Ax); return(pgcd_courant); } #define POLYNOME(yn,yd,xn,xd) \ { \ int pgcdx,xni,xdi; \ int y2n,y2ni; \ int y2d,y2di; \ int pgcdy,yni,ydi; \ int Pxni,Pxdi; \ /* Le "i" en queue de certains noms signifie "Irreductible" (voir le 'PGCD'...). */ \ \ y2n=yn*yn; \ y2d=yd*yd; \ \ pgcdx=pgcd(xn,xd); \ pgcdy=pgcd(yn,yd); \ \ xni=xn/pgcdx; \ xdi=xd/pgcdx; \ yni=yn/pgcdy; \ ydi=yd/pgcdy; \ y2ni=y2n/(pgcdy*pgcdy); \ y2di=y2d/(pgcdy*pgcdy); \ \ Pxni=(A*xni*xni*xni)+(B*xni*xni*xdi)+(C*xni*xdi*xdi)+(D*xdi*xdi*xdi); \ Pxdi=xdi*xdi*xdi; \ /* Calcul du Numerateur et du Denominateur du Polynome avec la variable Irreductible (N/D). */ \ \ if ((Pxni == y2ni) && (Pxdi == y2di)) \ { \ int index_courant=0; \ int DejaRencontre=FAUX; \ \ while ((index_courant <= index_maximal) && (DejaRencontre == FAUX)) \ { \ if ( (xni == Liste_xni[index_courant]) && (yni == Liste_yni[index_courant]) \ && (xdi == Liste_xdi[index_courant]) && (ydi == Liste_ydi[index_courant]) \ ) \ { \ DejaRencontre=VRAI; \ } \ else \ { \ index_courant++; \ } \ } \ \ if (DejaRencontre == FAUX) \ { \ if (index_maximal < NOMBRE) \ { \ index_maximal++; \ } \ else \ { \ printf("Debordement des listes {x,y}\n"); \ } \ \ Liste_xni[index_maximal]=xni; \ Liste_xdi[index_maximal]=xdi; \ Liste_yni[index_maximal]=yni; \ Liste_ydi[index_maximal]=ydi; \ \ printf("Point rationnel : x=%d/%d y=%d/%d y^2=P(x)=%d/%d\n",xni,xdi,yni,ydi,Pxni,Pxdi); \ } \ else \ { \ } \ } \ else \ { \ } \ } void main() { int index_maximal=0; double Liste_xni[NOMBRE]; double Liste_xdi[NOMBRE]; double Liste_yni[NOMBRE]; double Liste_ydi[NOMBRE]; int yn,yd,xn,xd; for (xn=XnD ; xn<=XnA ; xn++) { for (xd=XdD ; xd<=XdA ; xd++) { for (yn=YnD ; yn<=YnA ; yn++) { for (yd=YdD ; yd<=YdA ; yd++) { POLYNOME(yn,yd,xn,xd); } } } } }