Problème de modulo négatif

Bonjour j'ai un souci de modulo car j'aimerai garder le modulo positif or Arduino renvoie également le modulo négatif.
Merci d'avance.

en C++ la spec parle de l'opérateur "remainder"

ils mentionnent

Note: Until CWG issue 614 was resolved (N2757), if one or both operands to binary operator % were negative, the sign of the remainder was implementation-defined, as it depends on the rounding direction of integer division. The function std::div provided well-defined behavior in that case.

que souhaitez vous faire exactement ? (le modulo est défini que pour des entiers naturels ℕ et non pas sur ℤ, même si c'est extensible dans aux entiers relatifs, voire aux nombres réels ℝ )

Bonjour,

Il suffit de faire un modulo sur des nombres positifs.

Merci de votre réponse.
Je souhaite calculer le modulo d'un nombre plus petit que son diviseur mais obtenir le modulo positif.

Si tu es sûr que le nombre est plus petit que son diviseur, inutile de calculer un modulo : c'est le nombre lui-même.

3 mod 7 = 3

Bonjour timfouque

Peut être du côté de la fonction abs()

Cordialement
jpbbricole

Le soucis que j'ai c'est que j'ai deux modulos qui se suivent dans une boucle while.

 r = 1;
    while (e > 0) {
      r = ( r * ( a % n)  ) % n;
      e = e-1;
    }

a = 2664
n = 2881
et e = 601

ceci ne donne pas de nombre négatifs (même si on utilise long et pas unsigned long)

void setup() {
  Serial.begin(115200);
  unsigned long a = 2664;
  unsigned long n = 2881;
  unsigned long e = 601;
  unsigned long r = 1;
  while (e > 0) {
    r = ( r * ( a % n)  ) % n;
    Serial.println(r);
    e = e - 1;
  }
}

void loop() {}

si vous avez des nombres négatifs, peut être est-ce à cause de débordement dans les maths si vous avez des int au lieu de long et vous êtes sur un arduino 8 bits

Je ne saisi pas l'intérêt mathématique de ce code (à moins qu'il ai été volontairement - trop - simplifié...

et a étant plus petit que n, (a%n) c'est a..

donc la formule revient à r = (r*a) % n;

mais au vu de cette remarque

je pense que c'est lié à l'usage de int

C'est la partie d'un algorithme de chiffrement RSA.

#include <Arduino.h>

// Headers
String toString(double);
int toInt(String);
double toDouble(String);
int chiffrer(int m, int e);

int cleagent(String cleagent);

int modexp(int a, int e, int n);

void setup() {
  Serial.begin(9600); // Initialise la communication série à 9600 bauds
  randomSeed(analogRead(0)); // Initialise le générateur de nombres aléatoires
}

void loop() {
  int e, m, mp, c;
  String x;

  Serial.println("Identifiez-vous :");
  while (!Serial.available()) {} // Attendez que des données soient disponibles sur la communication série
  x = Serial.readString();
  m = 2644;
  e = cleagent(x);
  c = chiffrer(m, e);
  Serial.print("Message à déchiffrer : ");
  Serial.println(c);
  while (!Serial.available()) {}
  mp = Serial.parseInt();
  if (m == mp) {
    Serial.print("Vous êtes authentifié! Bienvenue agent ");
    Serial.println(x);
  } else {
    Serial.println("Erreur d'authentification, le système de sécurité se déclenchera dans 5 secondes");
  }
  delay(5000);
}

int chiffrer(int m, int e) {
  int n, c;
  n = 43*67;
  c = modexp(m, e, n);
  return c;
}

int cleagent(String cleagent) {
  int e;
  int clepublique[16] = {601, 619, 631, 641, 647, 653, 661, 673, 691, 701, 733, 739, 751, 797, 809, 811};
  String nomAgent[16] = {"A", "B", "C", "D", "E", "F", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q"};
  for (int i = 0; i < 16; i++) {
    if (cleagent == nomAgent[i]) {
      e = clepublique[i];
      return e;
    }
  }
  Serial.println("Erreur");
  return -1; // Valeur d'erreur
}

int modexp(int a, int e, int n) {
  int r;
  int h;
  if (e < 0) {
    Serial.println("unhandled case");
    return -1; // Valeur d'erreur
  }
  if (a == 0 || n == 1) {
    r = 0;
  } else {
    r = 1;
    while (e > 0) {
      r = ( r * ( a % n)  ) % n;
      e = e-1;
    }
  }
  return r;
}

String toString(double value) {
  return String(value);
}

int toInt(String text) {
  return text.toInt();
}

double toDouble(String text) {
  return text.toDouble();
}

changez les int en long ou unsigned long. sur un petit arduino un int peut représenter un nombre que jusqu'à 32767... je suppose que dans vos multiplications ça déborde et passe en négatif

gros gâchis de mémoire et de performance de faire ça....

ok merci de votre aide ça a fonctionné.

parfait - bonne continuation

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.