quadrillage(p,q):={
local k,j,L:=segment(0,p+i*q);
pour j de 0 jusque p faire
L:=L,segment(j,j+i*q);
fpour;
pour k de 0 jusque q faire
L:=L,segment(i*k,p+i*k);
fpour
L;
}:;
On tape :
quadrillage(3,5)
On obtient :
On remarque que la diagonale entre dans le premier carreau, puis elle entre
dans un nouveau carreau lorsqu'elle coupe
une ligne verticale ou une ligne horizontale ou à la fois une ligne verticale
et une ligne vhorizontale.
Puisqu'il y a p - 1 verticales et q - 1 horizontales à traverser,
si la diagonale ne coupe jamais à la fois une verticale et une horizontale
(c'est à dire si elle ne contient pas de points à coordonnées entières
à part le point de départ et le point d'arrivèe) le
nommbre de carreaux traversés est
1 + p - 1 + q - 1 = p + q - 1.
Si la diagonale coupe r fois, une verticale et une horizontale en même
temps, c'est à dire si elle contient r + 2 points à coordonnées
entières (+2 en comptant le point de départ et le point d'arrivèe) le
nommbre de carreaux traversés est p + q - 1 - r.
Que vaut r ?
La diagonale a comme équation
y = q*x/p = q1*x/p1 où p = p1*d et q = q1*d
avec d =pgcd(p, q) et elle aura des points à coordonnées entières
chaque fois que x est entier et que p1 divise q1*x. Puisque p1 et q1
sont premiers entre eux, p1 divise q1*x si x est un entier multiple de p1. Cela se produit lorsque
0 xp,
pour
x = 0, x = p1, x = 2*p1...x = d*p1 = p, soit d + 1 fois.
On a donc r + 2 = d + 1 et le
nommbre de carreaux traversés est p + q -pgcd(p, q).
On tape la fonction nbcarreaux :
nbcarreaux(p,q):={
local d;
d:=gcd(p,q);
return p+q-d;
}
On tape :
nuage_points([x,nbcarreaux(240,x)]$(x=0..300))
On obtient :
On tape :
plotlist([x,nbcarreaux(240,x)]$(x=0..300))
On obtient :