[Ma réponse] Re: Problème de l'arrêt

Liste des GroupesRevenir à fs maths 
Sujet : [Ma réponse] Re: Problème de l'arrêt
De : om+news (at) *nospam* miakinen.net (Olivier Miakinen)
Groupes : fr.sci.maths
Date : 30. Sep 2022, 22:48:46
Autres entêtes
Organisation : There's no cabale
Message-ID : <th7kne$alv$1@cabale.usenet-fr.net>
References : 1 2
User-Agent : Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0 SeaMonkey/2.49.4
Le 30/09/2022 12:53, j'écrivais :
 
def f(m, n):
   while n:
     m, n = m ^ n, (m & n) << 1
   return m
 
[...]
 
Lorsque l'un des nombres est négatif, il arrive que l'algorithme ne
s'arrête jamais. Par exemple lorsque m vaut -1 et que n vaut n'importe
quel nombre strictement positif.
 
Ma question est alors de déterminer pour quelles valeurs de m et n
le programme s'arrête et pour quelles valeurs il ne s'arrête jamais.
 
Question subsidiaire : lorsque le programme s'arrête, combien de
tours de boucle a-t-il réalisés ?

Voici ma réponse à cette question, sur un exemple.
Voyons par exemple f(-123350, 19676).

En binaire, les nombres -123350 et 19676 s'écrivent respectivement de la façon
suivante, où les « ... » du début indiquent que les 1 ou les 0 sont à imaginer
comme s'étendant jusqu'à l'infini vers la gauche :

 ...11100001111000101010
 ...00000100110011011100

Mettons une barre de séparation à droite de chaque colonne de chiffres égaux
(soit deux 0 l'un au dessus de l'autre, soit deux 1 l'un au dessus de l'autre) :

 ...1110|0|00|11|1|10|00101|010|
 ...0000|0|10|01|1|00|11011|100|

Ne retenons que les blocs se terminant par une colonne de deux 1 :

             |11|1|  |00101|
             |01|1|  |11011|

On a ici un bloc de longueur 2, un bloc de longueur 1 et un bloc de longueur 5.
Ma proposition est que le nombre de tours de boucle sera toujours exactement
égal à un de plus que la plus grande longueur de bloc retenu. Dans cet exemple,
ce sera donc 5 + 1 = 6 tours de boucle.

Plus généralement :
- Si n = 0, on fera 0 tour de boucle.
- Sinon, si on ne retient aucun bloc, on fera 1 tour de boucle.
- Sinon, soit l_max la longueur du plus grand bloc retenu, on fera (l_max + 1)
  tours de boucle. Notons qu'il peut y avoir plusieurs blocs de longueur l_max,
  ça ne changera rien au résultat.

Cas particulier, si l'un des nombres (mettons m) est négatif, et que l'autre
(donc n) est positif et supérieur ou égal à -m, alors le bloc le plus à gauche
est de longueur infinie. Dans ce cas, et dans ce cas seulement, le programme
boucle indéfiniment.


--
Olivier Miakinen

Date Sujet#  Auteur
30 Sep 22 * Que fait ce programme ?14ast
30 Sep 22 +* Re: Que fait ce programme ?4Olivier Miakinen
30 Sep 22 i+- Re: Que fait ce programme ?1Olivier Miakinen
30 Sep 22 i`* Re: Que fait ce programme ?2Olivier Miakinen
2 Oct 22 i `- Re: Que fait ce programme ?1ast
30 Sep 22 +- Re: Que fait ce programme ?1Michel Talon
30 Sep 22 +* Problème de l'arrêt (was: Que fait ce programme ?)7Olivier Miakinen
30 Sep 22 i+* Re: Problème de l'arrêt (was: Que fait ce programme ?)4maixxx
30 Sep 22 ii`* Re: Problème de l'arrêt3Olivier Miakinen
1 Oct 22 ii `* Re: Problème de l'arrêt2Michel Talon
1 Oct 22 ii  `- Re: Problème de l'arrêt1Olivier Miakinen
30 Sep 22 i`* [Ma réponse] Re: Problème de l'arrêt2Olivier Miakinen
30 Sep 22 i `- Re: [Ma réponse] Re: Problème de l'arrêt1Olivier Miakinen
1 Oct 22 `- Bis: Que fait ce programme ?1Olivier Miakinen

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal