Géométrie dynamique sur un corps fini

Utilisation à l'épreuve de modélisation de l'agrégation de mathématiques

Modérateur : xcasadmin

Répondre
alain974
Messages : 104
Inscription : lun. mai 24, 2010 11:15 am

Géométrie dynamique sur un corps fini

Message par alain974 » ven. juil. 23, 2010 7:12 am

Non, ce n'est pas un titre de film X (ou alors, X...CAS!) mais un concept qu'à ma grande déception, j'ai inventé tout seul, en introduisant un peu d'arithmétique dans CaRMetal. Tout est là:

http://db-maths.nuxit.net/CaRMetal/user ... s/discrete

sauf la caractéristique 2, traitée à part ici:

http://db-maths.nuxit.net/CaRMetal/user ... os/caract2

Voilà pour montrer ce que je voudrais faire avec xcas. Pourquoi xcas?
1:Sous CaRMetal, la principale difficulté vient de l'absence de fonctionnalités de calcul formel, en l'occurence la division modulo un nombre premier. xcas au contraire, est muni de "Galois" qui me semble être ce qu'il faut.
2:Ce qui fait qu'xcas n'est pas le meilleur logiciel de géométrie dynamique (graphique non vectoriel, manque de fluidité dans les mouvements) a peu d'importance dans ce cas précis (précis à l'unité pour être ... précis).

Aussi ai-je l'impression qu'xcas est le carcan idéal pour explorer ce domaine (calcul formel + programmation + ce qu'il faut de géométrie dynamique). Mais une lecture de la doc ne me montre pas comment faire... En fait je n'ai pas la certitude qu'on puisse le faire. Alors je commence par la question du jour:
Comment peut-on lier un point à un ensemble fini de points (un nuage) et récupérer dynamiquement ses coordonnées, ou le nom du point auquel il est couramment attaché?
(en d'autres termes, comment un point peut-il se mouvoir avec la souris, en ne pouvant prendre qu'un nombre fini de positions?)

parisse
Messages : 5734
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Géométrie dynamique sur un corps fini

Message par parisse » ven. juil. 23, 2010 11:12 am

pour faire ça, le mieux est je pense d'introduire un curseur par exemple avec pas entier, utiliser floor pour passer à des valeurs entières exactes et de paramétrer l'ensemble fini de points à parcourir par cet indice entier.

alain974
Messages : 104
Inscription : lun. mai 24, 2010 11:15 am

Re: Géométrie dynamique sur un corps fini

Message par alain974 » ven. juil. 23, 2010 2:35 pm

Ça veut dire qu'on ne peut pas bouger un point avec la souris, et le forcer à avoir par exemple des coordonnées entières?

parisse
Messages : 5734
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Géométrie dynamique sur un corps fini

Message par parisse » ven. juil. 23, 2010 2:51 pm

non, pas pour le moment en tout cas.
par contre rien n'empêche de définir un point à la souris par exemple A, et définir dans la ligne de commande du dessous un point dépendant
B:=point(floor(abscisse(A)),floor(ordonnee(A)))
et se servir de B dans la suite.

parisse
Messages : 5734
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Géométrie dynamique sur un corps fini

Message par parisse » ven. juil. 23, 2010 3:00 pm

Sinon, qu'est-ce que vous entendez par graphique non vectoriel?

alain974
Messages : 104
Inscription : lun. mai 24, 2010 11:15 am

Re: Géométrie dynamique sur un corps fini

Message par alain974 » ven. juil. 23, 2010 7:04 pm

Je voulais écrire "graphisme non vectoriel", et faisais allusion aux marches d'escalier qui montrent bien les pixels des lignes droites (surtout obliques). En géométrie dynamique, on retrouve ce style chez Declic, GeoPlan, DrGeo et Kig et avec l'habitude, on s'accroche vite aux traits vectoriels de GeoGebra et CaRMetal (inteface java?). Je soupçonne l'antialiasing d'être responsable de cette qualité du graphisme...

Par ailleurs, il est vrai qu'en pilotant B par A comme ci-dessus, et en rendant A presque invisible, on a l'impression que B bouge sur un réseau, mais le confort n'est pas celui de CaRMetal avec ses points magnétiques. Je vais quand même essayer d'aller le plus loin possible en géométrie sur un Z/pZ (p premier); d'où le choix de cette rubrique pour ce post. La prochaine question du jour sera donc ... pour un autre jour!

parisse
Messages : 5734
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Géométrie dynamique sur un corps fini

Message par parisse » ven. juil. 23, 2010 8:32 pm

Je ne vois pas comment on peut éviter les "marches d'escaliers" comme vous dites, puisque l'écran est fait de pixels, il y a forcément discrétisation des objets géométriques (par exemple par l'algorithme de Bresenham pour les droites) et une droite oblique aura forcément des marches (sauf pour une valeur de pente). Après il est possible que certaines librairies graphiques arrivent à rendre ceci moins visible, peut-etre en allumant plus de pixels, mais est-ce vraiment important?
En tout cas ça n'a rien à voir avec le fait d'être vectoriel ou non, en l'occurence les objets géométriques dans xcas sont vectoriels, le zoom in ne dégrade pas la qualité d'un objet géométrique (ce qui serait le cas pour un objet non vectoriel défini pixel par pixel). Par contre les graphes de fonction n'ont pas cette propriété (je ne sais pas si c'est pareil pour geogebra, mais si ce n'est pas le cas, ca nécessite de réévaluer la fonction à chaque changement de repère).

alain974
Messages : 104
Inscription : lun. mai 24, 2010 11:15 am

Re: Géométrie dynamique sur un corps fini

Message par alain974 » dim. juil. 25, 2010 10:14 am

parisse a écrit :peut-etre en allumant plus de pixels, mais est-ce vraiment important?
Seulement pour les snobs comme moi (mais c'est contagieux, mes élèves aussi sont habitués à la qualité graphique)... Il semble en effet que les écrans des logiciels en Java soient antialiasés ce qui améliore la qualité des lignes. Maintenant si on veut du vectoriel on n'a qu'à exporter en LaTeX...

Pour manipuler un point lié à un plan affine fini, on peut créer une fonction "fini":

Code : Tout sélectionner

fini(x,p):={

if ((x<0)||(x>=p)) {
  Return 0;
}
else {
  Return floor(x);
}
dont les valeurs sont éléments de Z/pZ, et après la création d'un point C libre, le code

Code : Tout sélectionner

M:=point(fini(abscisse(C),7),fini(ordonnee(C),7))
produit un point M appartenant au plan affine à 49 points. Il est donc possible de créer un point dynamique dans un plan fini (mais il se comporte bizarrement si on le déplace de force à la souris, avant de le piloter à nouveau par C).

Mais pour manipuler C (et donc M), il faut sélectionner le mode "pointeur";

Pour dessiner le plan (en image de fond), on peut faire ceci:

Code : Tout sélectionner

nuage(p):={

for(x:=0;x<p;x++){
  for(y:=0;y<p;y++){
    m:=point(x,y);
    affichage(m,3,square_point);
  }
}

} 
Le dessin est assez réussi (par exemple en entrant nuage(7)), mais il se crée dans une fenêtre supplémentaire appelée "Xcas Fenetre DispG" qui ne possède pas de menu, il n'est donc pas possible de bouger le point C ci-dessus parce que dans "Xcas Fenetre DispG", la souris contrôle tout le graphique et pas le point sélectionné (sans menu, passer au mode "pointeur" n'est pas évident...).

La question du jour est donc la suivante:
Peut-on créer un point mobile dans "Xcas Fenetre DispG"; y a-t-il un moyen de le contrôler?
Sinon il ne restera que la solution du curseur entier pour piloter les points du plan affine fini (à condition de pouvoir utiliser des curseurs dans "Xcas Fenetre DispG"...)

parisse
Messages : 5734
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Géométrie dynamique sur un corps fini

Message par parisse » dim. juil. 25, 2010 5:22 pm

Non, ce n'est pas dans DispG qu'il faut faire un point mobile, cette fenetre est la pour la compatibilité TI et aussi pour permettre de faire facilement des boucles avec affichage graphique (par exemple en seconde). Ce qu'il faut faire, c'est créer le nuage de points dans la fenêtre graphique normale, et pour ça il faut modifier nuage pour qu'il renvoie une séquence (ou une liste) contenant tous les points à afficher:

Code : Tout sélectionner

nuage(p):={
local res,x,y,m;
res:=NULL;
for(x:=0;x<p;x++){
  for(y:=0;y<p;y++){
    m:=point(x,y);
    res:=res,affichage(m,3,square_point);
  }
}
return res;
} 

alain974
Messages : 104
Inscription : lun. mai 24, 2010 11:15 am

Re: Géométrie dynamique sur un corps fini

Message par alain974 » lun. juil. 26, 2010 8:08 am

Merci pour toutes ces réponses, et bravo pour la rapidité avec laquelle elles pleuvent!

Avec une nouvelle fonction pour le dessin du plan fini:

Code : Tout sélectionner

nuage(p):={
local res,x,y,m;
res:=NULL;
for(x:=0;x<p;x++){
  for(y:=0;y<p;y++){
    m:=point(x,y);
    res:=res,affichage(m,rhombus_point+green);
  }
}
return res;
} 
et une nouvelle fonction "droite par deux points" nommée "fdroite" (f comme fini, pas comme float):

Code : Tout sélectionner

fdroite(A,B,p,coul):={
local dte,n;
dte:=A,B;
for(n:=0;n<p;n++){
  m:=point(irem(abscisse(A)+(abscisse(B)-abscisse(A))*n,p),irem(ordonnee(A)+(ordonnee(B)-ordonnee(A))*n,p))
    dte:=dte,affichage(m,4,square_point+coul);
}
}
la suite d'instructions suivantes dessine les droites (AB) et (CD) comme nuages de points, et leur intersection I, en magenta (ne pas oublier de mettre les points A1, B1, C1 et D1 en gris clair, et éviter de bouger A, B, C et D):

Code : Tout sélectionner

A:=point(fini(abscisse(A1),7),fini(ordonnee(A1),7),'affichage'=bleu+epaisseur_ligne_2+epaisseur_point_2+point_carre+rempli))

B:=point(fini(abscisse(B1),7),fini(ordonnee(B1),7),'affichage'=bleu+epaisseur_ligne_2+epaisseur_point_2+point_carre+rempli))

fdroite(A,B,7,bleu)

C:=point(fini(abscisse(C1),7),fini(ordonnee(C1),7),'affichage'=rouge+epaisseur_ligne_2+epaisseur_point_2+point_carre+rempli))

D:=point(fini(abscisse(D1),7),fini(ordonnee(D1),7),'affichage'=rouge+epaisseur_ligne_2+epaisseur_point_2+point_carre+rempli))

fdroite(C,D,7,rouge)

xu:=round(abscisse(B)-abscisse(A)) mod 7

yu:=round(ordonnee(B)-ordonnee(A)) mod 7

T:=linsolve([((x-abscisse(A))*yu-(y-ordonnee(A))*xu)mod 7=0,((x-abscisse(C))*yv-(y-ordonnee(C))*xv) mod 7=0],[x,y])

I:=point(T,'affichage'=(magenta+epaisseur_point_3+point_croix))
Sauf que, si le point I disparaît bien lorsque les droites (AB) et (CD) sont parallèles, il devient égal à D quand les droites sont sécantes, même lorsque le point d'intersection n'est pas D. Par exemple, si les deux droites passent par l'origine, la dernière ligne affiche "point(0 % 7)" ce qui est la bonne intersection, mais I est toujours sur D...

La question du jour sera donc la suivante:
Pourquoi? I est bien calculé mais mal affiché...

parisse
Messages : 5734
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Géométrie dynamique sur un corps fini

Message par parisse » mar. juil. 27, 2010 5:57 am

alain974 a écrit :Sauf que, si le point I disparaît bien lorsque les droites (AB) et (CD) sont parallèles, il devient égal à D quand les droites sont sécantes, même lorsque le point d'intersection n'est pas D. Par exemple, si les deux droites passent par l'origine, la dernière ligne affiche "point(0 % 7)" ce qui est la bonne intersection, mais I est toujours sur D...

La question du jour sera donc la suivante:
Pourquoi? I est bien calculé mais mal affiché...
C'est parce que rien n'est prévu pour faire afficher des points à coordonnées dans Z/7Z. Il faut donc "démodulariser" les coordonnées du point:
point(affixe(I)%0)
(le %0 transforme un modulaire de Z/pZ en son représentant symétrique compris entre -p/2 et p/2).

Répondre