/*
  Sketch: p_Tripel
  Datum: 14.04.2024
  Zweck: Erzeugen von teilerfremden pythagoreischen Tripeln
  Autor: MIWIS
  Beweis und Herleitung der verwendeten Formel:
  Wir schreiben eine quadratische Gleichung folgendermassen:
  (x-y)^2 + z^2 = (x+y)^2
  durch Ausmultiplizieren erhalten wir
  (x^2 - 2xy + y^2) + z^2 = (x^2 + 2xy + y^2)
  durch Umformen erhalten wir
  z^2 = 4*x*y
  damit z^2 erfüllt ist, ersetzen wir x durch a^2 und y durch b^2 
  und erhalten die Formel
  (a^2 - b^2)^2 + 4 * a^2 * b^2 = (a^2 + b^2)^2
  q.e.d
*/

unsigned long a;
unsigned long b;
unsigned long stop = 8; //beenden, wenn a = stop

void setup() {
  Serial.begin(115200);
  Serial.println("***Programm startet***");
  Serial.println();
  Serial.print("Wir erzeugen teilerfremde pythagoreische Tripel und ");
  Serial.println("verwenden hierfür die Formel:");
  Serial.println("(a*a-b*b)^2 + (2*a*b)^2 = (a*a+b*b)^2 ");
  Serial.println();
  for (a = 2; a <= stop; a++) {
    for (b = 1; b < a; b++) {
      if (teilerfremd(a * a - b * b, a * a + b * b)) {
        Serial.print(" a=");
        Serial.print(a);
        Serial.print(" b=");
        Serial.print(b);
        Serial.print(" => ");
        Serial.print(a * a - b * b);
        Serial.print("^2 + ");
        Serial.print(2 * a * b);
        Serial.print("^2 = ");
        Serial.print(a * a + b * b);
        Serial.println("^2");
      }
    }
  }
  Serial.println();
  Serial.println("***Programm beendet***");
}


void loop() {
}

unsigned long teilerfremd(unsigned long a, unsigned long b) {
  unsigned long rest;
  //Serial.print(a);
  //Serial.print(" ");
  //Serial.println(b);
 //Euklidischer Algorithmus ggT mit Modulo
  while (1) {
    // a % b bedeutet den Teilerrest von a / b (Modulo)
    rest = a % b;
    a = b;
    b = rest;
    //Serial.println(b);
    // b=1 => teilerfremd, b=0 => nicht teilerfremd (0=>falsch)
    if (b < 2) {
      return (b);
    }
  }
}