Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Que fait ce programme ?

7 réponses
Avatar
ast
Devinette: Que retourne cette petite fonction python

(m et n sont 2 entiers naturels)


def f(m, n):
while n:
m, n = m ^ n, (m & n) << 1
return m


pour ceux qui ne connaissent pas python

"while n" c'est "pendant que n est non nul"

^ est l'opérateur "ou exclusif" bit Í  bit
& est le "et" bit Í  bit
<< 1 décalage Í  gauche bit Í  bit et ajout d'un 0 Í  droite

a, b = c, d affectation simultanée a <- c et b <- d

7 réponses

Avatar
Olivier Miakinen
Le 30/09/2022 Í  07:17, ast a écrit :
Devinette: Que retourne cette petite fonction python
(m et n sont 2 entiers naturels)
def f(m, n):
while n:
m, n = m ^ n, (m & n) << 1
return m

Je n'ai pas encore compris comment ça fonctionne, mais cette fonction
semble être une façon compliquée de réaliser une opération simple.
Des quelques tests que j'ai réalisés, cela fonctionne même avec des
nombres négatifs, sauf que l'appel suivant semble boucler indéfiniment :
f(-10,12)
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 30/09/2022 Í  11:14, je répondais Í  ast :
Devinette: Que retourne cette petite fonction python
(m et n sont 2 entiers naturels)
def f(m, n):
while n:
m, n = m ^ n, (m & n) << 1
return m

Je n'ai pas encore compris comment ça fonctionne, mais cette fonction
semble être une façon compliquée de réaliser une opération simple.
Des quelques tests que j'ai réalisés, cela fonctionne même avec des
nombres négatifs, sauf que l'appel suivant semble boucler indéfiniment :
f(-10,12)

Bien évidemment ce n'est pas le seul cas o͹ ça boucle indéfiniment, mais
lorsque ça ne boucle pas le résultat est conforme aux attentes.
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 30/09/2022 Í  11:14, j'écrivais :
def f(m, n):
while n:
m, n = m ^ n, (m & n) << 1
return m

Je n'ai pas encore compris comment ça fonctionne

Ok, j'ai compris comment ça fonctionne. Réponse en ROT-13.
Cbhe har cnver qr ovgf qbaaéf Í  yn cbfvgvba x (p'rfg-Í -qver qr
cbvqf 2^x) :
- f'vyf fbag gbhf yrf qrhk ahyf vyf erfgrag ahyf nceèf y'bcéengvba ;
- fv y'ha qrf qrf qrhk inhg méeb rg y'nhger ha, nceèf y'bcéengvba
ba ergebhir ha qnaf z rg méeb qnaf a Í  prggr cbfvgvba ;
- f'vyf fbag gbhf yrf qrhk étnhk Í  ha, ba ergebhir méeb qnaf z Í 
prggr cbfvgvba, rg ha qnaf a Í  yn cbfvgvba x+1. P'rfg-Í -qver dhr
2^x nwbhgé Í  2^x qbaar 2^(x+1).
Crgvg ͠ crgvg ba rssrpghr qbap yn fbzzr qr z rg qr a, b͹ ͠ pundhr
égncr ba ergebhir yrf fbzzrf fnaf ergrahr qnaf z rg yrf ergrahrf
qnaf a.
--
Olivier Miakinen
Avatar
Michel Talon
Le 30/09/2022 Í  07:17, ast a écrit :
Devinette: Que retourne cette petite fonction python
(m et n sont 2 entiers naturels)
def f(m, n):
  while n:
    m, n = m ^ n, (m & n) << 1
  return m
pour ceux qui ne connaissent pas python
"while n" c'est "pendant que n est non nul"
^ est l'opérateur "ou exclusif" bit Í  bit
& est le "et" bit Í  bit
<< 1 décalage Í  gauche bit Í  bit et ajout d'un 0 Í  droite
a, b = c, d  affectation simultanée a <- c et b <- d

m+n
--
Michel Talon
Avatar
Olivier Miakinen
[diapublication, suivi vers fr.sci.maths seul]
Bonjour,
Le 30/09/2022 Í  07:17, ast avait écrit :
def f(m, n):
while n:
m, n = m ^ n, (m & n) << 1
return m

Comme l'écrivait Michel Talon, cette fonction retourne simplement
la somme des entiers m et n, du moins cela fonctionne pour tous les
entiers positifs. À chaque tour de boucle, on retrouve dans m la
somme bit Í  bit des nombres m et n *sans tenir compte des retenues*,
et dans n la somme de toutes les retenues. Au bout d'un petit
nombre de tours de boucle, il n'y a plus aucune retenue Í  faire, et
alors le nombre n vaut 0 tandis que le nombre m contient le résultat
attendu Í  savoir la somme des nombres m et n de départ.
Je voudrais maintenant étendre la question d'ast, en faisant suivre
vers fr.sci.maths seul car ça n'a plus rien de spécifique Í  python.
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 ?
Précision pour la représentation des nombres en binaire, un nombre
positif comporte « Í  gauche » une infinité de chiffres binaires
valant zéro, tandis que les nombres négatifs ont une infinité de
chiffres Í  1.
Exemples :
3 = ...0000011
2 = ...0000010
1 = ...0000001
0 = ...0000000
-1 = ...1111111
-2 = ...1111110
-3 = ...1111101
-4 = ...1111100
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 30/09/2022 Í  07:17, ast a écrit :
Devinette: Que retourne cette petite fonction python
(m et n sont 2 entiers naturels)
def f(m, n):
while n:
m, n = m ^ n, (m & n) << 1
return m

Même question, en ajoutant un simple ~ Í  la troisième ligne :
def f(m, n):
while n:
m, n = m ^ n, (~m & n) << 1
return m
pour ceux qui ne connaissent pas python
"while n" c'est "pendant que n est non nul"
^ est l'opérateur "ou exclusif" bit Í  bit
& est le "et" bit Í  bit
<< 1 décalage Í  gauche bit Í  bit et ajout d'un 0 Í  droite
a, b = c, d affectation simultanée a <- c et b <- d

Toujours pour ceux qui ne connaissent pas python :
~ est l'opérateur « inverser tous les bits » (les 1 deviennent des 0
et les 0 deviennent des 1)
En particulier, si m est un nombre entier, -m est égal Í  (~m + 1)
--
Olivier Miakinen
Avatar
ast
Le 30/09/2022 Í  11:29, Olivier Miakinen a écrit :
Le 30/09/2022 Í  11:14, j'écrivais :
def f(m, n):
while n:
m, n = m ^ n, (m & n) << 1
return m

Je n'ai pas encore compris comment ça fonctionne

Ok, j'ai compris comment ça fonctionne. Réponse en ROT-13.
Cbhe har cnver qr ovgf qbaaéf Í  yn cbfvgvba x (p'rfg-Í -qver qr
cbvqf 2^x) :
- f'vyf fbag gbhf yrf qrhk ahyf vyf erfgrag ahyf nceèf y'bcéengvba ;
- fv y'ha qrf qrf qrhk inhg méeb rg y'nhger ha, nceèf y'bcéengvba
ba ergebhir ha qnaf z rg méeb qnaf a Í  prggr cbfvgvba ;
- f'vyf fbag gbhf yrf qrhk étnhk Í  ha, ba ergebhir méeb qnaf z Í 
prggr cbfvgvba, rg ha qnaf a Í  yn cbfvgvba x+1. P'rfg-Í -qver dhr
2^x nwbhgé Í  2^x qbaar 2^(x+1).
Crgvg ͠ crgvg ba rssrpghr qbap yn fbzzr qr z rg qr a, b͹ ͠ pundhr
égncr ba ergebhir yrf fbzzrf fnaf ergrahr qnaf z rg yrf ergrahrf
qnaf a.

oui bien vu
m contient la somme sans les retenues et n contient les retenues
On additionne les retenues après coup, ce qui génère de nouvelles
retenues, et on réitère pendant qu'il y a des retenues.