diff --git a/20231130/hanoi-0.c b/20231130/hanoi-0.c
new file mode 100644
index 0000000000000000000000000000000000000000..83b5f081e33e699f2d5eaa1f858320530e1b2820
--- /dev/null
+++ b/20231130/hanoi-0.c
@@ -0,0 +1,26 @@
+#include <stdio.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+
+void display (void)
+{
+  printf ("\n");
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d:", i);
+      for (int j = 0; j < n[i]; j++)
+        printf (" %d", tower[i][j]);
+      printf ("\n");
+    }
+}
+
+int main (void)
+{
+  n[0] = 0;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+  return 0;
+}
diff --git a/20231130/hanoi-1.c b/20231130/hanoi-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6d005f0b12afa6086afb65e1794fb5c977b474e2
--- /dev/null
+++ b/20231130/hanoi-1.c
@@ -0,0 +1,30 @@
+#include <stdio.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+
+void display (void)
+{
+  printf ("\n");
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d:", i);
+      for (int j = 0; j < n[i]; j++)
+        printf (" %d", tower[i][j]);
+      printf ("\n");
+    }
+}
+
+int main (void)
+{
+  n[0] = 4;
+  tower[0][0] = 4;
+  tower[0][1] = 3;
+  tower[0][2] = 2;
+  tower[0][3] = 1;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+  return 0;
+}
diff --git a/20231130/hanoi-2.c b/20231130/hanoi-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..c928c1130539da08d0882249bdffc877d72289b2
--- /dev/null
+++ b/20231130/hanoi-2.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+
+void display (void)
+{
+  printf ("\n");
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d:", i);
+      for (int j = 0; j < n[i]; j++)
+        printf (" %d", tower[i][j]);
+      printf ("\n");
+    }
+}
+
+int main (void)
+{
+  n[0] = DISKS;
+  for (int i = 0; i < DISKS; i++)
+    tower[0][i] = DISKS - i;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+  return 0;
+}
diff --git a/20231130/hanoi-3.c b/20231130/hanoi-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..4b59c046962c1f79eca315882d93faf6b6c298c1
--- /dev/null
+++ b/20231130/hanoi-3.c
@@ -0,0 +1,44 @@
+#include <stdio.h>
+#include <error.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+
+void display (void)
+{
+  printf ("\n");
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d:", i);
+      for (int j = 0; j < n[i]; j++)
+        printf (" %d", tower[i][j]);
+      printf ("\n");
+    }
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        error (1, 0, "trying to move disk from empty tower");
+      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
+        error (1, 0, "trying to move larger disk on smaller one");
+      tower[to][n[to]] = tower[from][n[from] - 1];
+      n[to]++;
+      n[from]--;
+    }
+}
+
+int main (void)
+{
+  n[0] = DISKS;
+  for (int i = 0; i < DISKS; i++)
+    tower[0][i] = DISKS - i;
+  n[1] = 0;
+  n[2] = 0;
+  move (2, 0, 1);
+  display ();
+  return 0;
+}
diff --git a/20231130/hanoi-4.c b/20231130/hanoi-4.c
new file mode 100644
index 0000000000000000000000000000000000000000..162a5ba7cccedf64bff8ae9a514aaf146088e3a4
--- /dev/null
+++ b/20231130/hanoi-4.c
@@ -0,0 +1,44 @@
+#include <stdio.h>
+#include <error.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+
+void display (void)
+{
+  printf ("\n");
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d:", i);
+      for (int j = 0; j < n[i]; j++)
+        printf (" %d", tower[i][j]);
+      printf ("\n");
+    }
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        error (1, 0, "trying to move disk from empty tower");
+      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
+        error (1, 0, "trying to move larger disk on smaller one");
+      tower[to][n[to]] = tower[from][n[from] - 1];
+      n[to]++;
+      n[from]--;
+    }
+}
+
+int main (void)
+{
+  n[0] = DISKS;
+  for (int i = 0; i < DISKS; i++)
+    tower[0][i] = DISKS - i;
+  n[1] = 0;
+  n[2] = 0;
+  move (0, 2, 1);
+  display ();
+  return 0;
+}
diff --git a/20231130/hanoi-5.c b/20231130/hanoi-5.c
new file mode 100644
index 0000000000000000000000000000000000000000..e04ad85f63fe92e5c15d22646beb9e9107bf78d6
--- /dev/null
+++ b/20231130/hanoi-5.c
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <error.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+
+void display (void)
+{
+  printf ("\n");
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d:", i);
+      for (int j = 0; j < n[i]; j++)
+        printf (" %d", tower[i][j]);
+      printf ("\n");
+    }
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        error (1, 0, "trying to move disk from empty tower");
+      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
+        error (1, 0, "trying to move larger disk on smaller one");
+      tower[to][n[to]] = tower[from][n[from] - 1];
+      n[to]++;
+      n[from]--;
+      display ();
+    }
+}
+
+int main (void)
+{
+  n[0] = DISKS;
+  for (int i = 0; i < DISKS; i++)
+    tower[0][i] = DISKS - i;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+  move (0, 2, 1);
+  return 0;
+}
diff --git a/20231130/hanoi-6.c b/20231130/hanoi-6.c
new file mode 100644
index 0000000000000000000000000000000000000000..1267605f802246e857c32d29cc0a132609cb24ce
--- /dev/null
+++ b/20231130/hanoi-6.c
@@ -0,0 +1,52 @@
+#include <stdio.h>
+#include <error.h>
+
+#define DISKS 4
+
+int n[3], tower[3][DISKS];
+
+void display (void)
+{
+  printf ("\n");
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d:", i);
+      for (int j = 0; j < n[i]; j++)
+        printf (" %d", tower[i][j]);
+      printf ("\n");
+    }
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        error (1, 0, "trying to move disk from empty tower");
+      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
+        error (1, 0, "trying to move larger disk on smaller one");
+      tower[to][n[to]] = tower[from][n[from] - 1];
+      n[to]++;
+      n[from]--;
+      display ();
+    }
+  else
+    {
+      int help = 0 + 1 + 2 - from - to;
+      move (from, help, disks - 1);
+      move (from, to, 1);
+      move (help, to, disks - 1);
+    }
+}
+
+int main (void)
+{
+  n[0] = DISKS;
+  for (int i = 0; i < DISKS; i++)
+    tower[0][i] = DISKS - i;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+  move (0, 2, DISKS);
+  return 0;
+}
diff --git a/20231130/hanoi-7.c b/20231130/hanoi-7.c
new file mode 100644
index 0000000000000000000000000000000000000000..f71fcdc0c3f66047ee3ad870d019a06eb328050f
--- /dev/null
+++ b/20231130/hanoi-7.c
@@ -0,0 +1,52 @@
+#include <stdio.h>
+#include <error.h>
+
+#define DISKS 5
+
+int n[3], tower[3][DISKS];
+
+void display (void)
+{
+  printf ("\n");
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d:", i);
+      for (int j = 0; j < n[i]; j++)
+        printf (" %d", tower[i][j]);
+      printf ("\n");
+    }
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        error (1, 0, "trying to move disk from empty tower");
+      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
+        error (1, 0, "trying to move larger disk on smaller one");
+      tower[to][n[to]] = tower[from][n[from] - 1];
+      n[to]++;
+      n[from]--;
+      display ();
+    }
+  else
+    {
+      int help = 0 + 1 + 2 - from - to;
+      move (from, help, disks - 1);
+      move (from, to, 1);
+      move (help, to, disks - 1);
+    }
+}
+
+int main (void)
+{
+  n[0] = DISKS;
+  for (int i = 0; i < DISKS; i++)
+    tower[0][i] = DISKS - i;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+  move (0, 2, DISKS);
+  return 0;
+}
diff --git a/20231130/hanoi-8.c b/20231130/hanoi-8.c
new file mode 100644
index 0000000000000000000000000000000000000000..6d804063531d424a82924a89d85424c33994793b
--- /dev/null
+++ b/20231130/hanoi-8.c
@@ -0,0 +1,52 @@
+#include <stdio.h>
+#include <error.h>
+
+#define DISKS 64
+
+int n[3], tower[3][DISKS];
+
+void display (void)
+{
+  printf ("\n");
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d:", i);
+      for (int j = 0; j < n[i]; j++)
+        printf (" %d", tower[i][j]);
+      printf ("\n");
+    }
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        error (1, 0, "trying to move disk from empty tower");
+      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
+        error (1, 0, "trying to move larger disk on smaller one");
+      tower[to][n[to]] = tower[from][n[from] - 1];
+      n[to]++;
+      n[from]--;
+      display ();
+    }
+  else
+    {
+      int help = 0 + 1 + 2 - from - to;
+      move (from, help, disks - 1);
+      move (from, to, 1);
+      move (help, to, disks - 1);
+    }
+}
+
+int main (void)
+{
+  n[0] = DISKS;
+  for (int i = 0; i < DISKS; i++)
+    tower[0][i] = DISKS - i;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+  move (0, 2, DISKS);
+  return 0;
+}
diff --git a/20231130/hanoi-9.c b/20231130/hanoi-9.c
new file mode 100644
index 0000000000000000000000000000000000000000..7694b373b7011e96f6be0ad0f00ba54b67086158
--- /dev/null
+++ b/20231130/hanoi-9.c
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include <error.h>
+
+#define DISKS 64
+
+int n[3], tower[3][DISKS];
+
+void display (void)
+{
+  printf ("\n");
+  for (int i = 0; i < 3; i++)
+    {
+      printf ("tower %d:", i);
+      for (int j = 0; j < n[i]; j++)
+        printf (" %d", tower[i][j]);
+      printf ("\n");
+    }
+}
+
+void move (int from, int to, int disks)
+{
+  if (disks == 1)
+    {
+      if (n[from] <= 0)
+        error (1, 0, "trying to move disk from empty tower");
+      if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
+        error (1, 0, "trying to move larger disk on smaller one");
+      tower[to][n[to]] = tower[from][n[from] - 1];
+      n[to]++;
+      n[from]--;
+      static int counter = 1;
+      if (counter++ >= 100000000)
+        {
+          display ();
+          counter = 1;
+        }
+    }
+  else
+    {
+      int help = 0 + 1 + 2 - from - to;
+      move (from, help, disks - 1);
+      move (from, to, 1);
+      move (help, to, disks - 1);
+    }
+}
+
+int main (void)
+{
+  n[0] = DISKS;
+  for (int i = 0; i < DISKS; i++)
+    tower[0][i] = DISKS - i;
+  n[1] = 0;
+  n[2] = 0;
+  display ();
+  move (0, 2, DISKS);
+  display ();
+  return 0;
+}
diff --git a/20231130/hp-20231130.pdf b/20231130/hp-20231130.pdf
index 66a0a71f6fe530d0c1e6581494b379a7654070ad..5b874dd081f07bc7110a99532598d0da58a1fa0d 100644
Binary files a/20231130/hp-20231130.pdf and b/20231130/hp-20231130.pdf differ
diff --git a/20231130/hp-20231130.tex b/20231130/hp-20231130.tex
index c878d5d163e8a26275d773eab12032d163964ddf..8901b9350f0e3dd1826b9a73b29e777058cc722c 100644
--- a/20231130/hp-20231130.tex
+++ b/20231130/hp-20231130.tex
@@ -20,7 +20,7 @@
 % Attribution-ShareAlike 3.0 Unported License along with this
 % document.  If not, see <http://creativecommons.org/licenses/>.
 
-% README: Algorithmen: Rekursion, Aufwandsabschätzungen
+% README: Algorithmen: Rekursion
 
 \documentclass[10pt,t]{beamer}
 
@@ -64,6 +64,7 @@
         \item[5.1] Differentialgleichungen
         \color{red}
         \item[5.2] Rekursion
+        \color{black}
         \item[5.3] Aufwandsabschätzungen
       \end{itemize}
     \item[\textbf{6}] \textbf{Objektorientierte Programmierung}
@@ -442,6 +443,8 @@
 
 \end{frame}
 
+\iffalse
+
 \subsection{Aufwandsabschätzungen \protect\color{gray}-- Komplexitätsanalyse}
 
 \begin{frame}[fragile]
@@ -592,4 +595,6 @@
 
 \end{frame}
 
+\fi
+
 \end{document}
diff --git a/20231130/landau-symbols-2.pdf b/20231130/landau-symbols-2.pdf
deleted file mode 120000
index 6b458b6efd8e274824a6dfcaabc4b9c27d196dc4..0000000000000000000000000000000000000000
--- a/20231130/landau-symbols-2.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols-2.pdf
\ No newline at end of file
diff --git a/20231130/landau-symbols-3.pdf b/20231130/landau-symbols-3.pdf
deleted file mode 120000
index 46efa409b35ff5df763c744a423599cba515d886..0000000000000000000000000000000000000000
--- a/20231130/landau-symbols-3.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols-3.pdf
\ No newline at end of file
diff --git a/20231130/landau-symbols.pdf b/20231130/landau-symbols.pdf
deleted file mode 120000
index ca145425bf07439c680632aa0663f84be601a565..0000000000000000000000000000000000000000
--- a/20231130/landau-symbols.pdf
+++ /dev/null
@@ -1 +0,0 @@
-../common/landau-symbols.pdf
\ No newline at end of file
diff --git a/20231130/mathematisches-pendel-01-kraeftezerlegung.png b/20231130/mathematisches-pendel-01-kraeftezerlegung.png
new file mode 100644
index 0000000000000000000000000000000000000000..950bfdabfa6dca689233ad90ef3bb54d7e371885
Binary files /dev/null and b/20231130/mathematisches-pendel-01-kraeftezerlegung.png differ
diff --git a/20231130/mathematisches-pendel-02-kleinwinkelnaeherung.png b/20231130/mathematisches-pendel-02-kleinwinkelnaeherung.png
new file mode 100644
index 0000000000000000000000000000000000000000..a62a1b6deccb8ddf865b5dd68ec0aa18d16a4e79
Binary files /dev/null and b/20231130/mathematisches-pendel-02-kleinwinkelnaeherung.png differ
diff --git a/20231130/mathematisches-pendel.xcf.gz b/20231130/mathematisches-pendel.xcf.gz
new file mode 100644
index 0000000000000000000000000000000000000000..35cd09007ac19a6f8c37d47fcf3537ca913d69f5
Binary files /dev/null and b/20231130/mathematisches-pendel.xcf.gz differ
diff --git a/20231130/pendulum-1.c b/20231130/pendulum-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..0024b2bc283c5d9b76a3148359254aab38fca282
--- /dev/null
+++ b/20231130/pendulum-1.c
@@ -0,0 +1,69 @@
+#include <gtk/gtk.h>
+#include <math.h>
+
+#define WIDTH 320
+#define HEIGHT 240
+#define GAP (HEIGHT / 20)
+#define r GAP
+#define visual_length (HEIGHT - 2 * GAP - r)
+
+#define phi0 (-0.5)
+#define omega0 0.0
+#define t0 0.0
+#define g 9.81
+#define l 1.0
+#define dt 0.02
+
+double t = t0;
+double phi = phi0;
+double omega = omega0;
+
+gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
+{
+  GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 };
+
+  int x = WIDTH / 2 + visual_length * sin (phi);
+  int y = GAP + visual_length * cos (phi);
+
+  gdk_cairo_set_source_rgba (c, &blue);
+  cairo_move_to (c, WIDTH / 2, GAP);
+  cairo_line_to (c, x, y);
+  cairo_stroke (c);
+  cairo_arc (c, x, y, r, 0, 2 * G_PI);
+  cairo_fill (c);
+
+  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
+                    FALSE to propagate the event further. */
+}
+
+gboolean timer (GtkWidget *widget)
+{
+  t += dt;
+  phi += omega * dt;
+  omega += - dt * g / l * sin (phi);
+
+  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
+  g_timeout_add (50, (GSourceFunc) timer, widget);
+  return FALSE;
+}
+
+int main (int argc, char **argv)
+{
+  gtk_init (&argc, &argv);
+
+  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_widget_show (window);
+  gtk_window_set_title (GTK_WINDOW (window), "Hello");
+  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
+
+  GtkWidget *drawing_area = gtk_drawing_area_new ();
+  gtk_widget_show (drawing_area);
+  gtk_container_add (GTK_CONTAINER (window), drawing_area);
+  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
+  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
+
+  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
+
+  gtk_main ();
+  return 0;
+}
diff --git a/20231130/pendulum-2.c b/20231130/pendulum-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..d307d37307ec1fea3297be1f0157dddbede77fd6
--- /dev/null
+++ b/20231130/pendulum-2.c
@@ -0,0 +1,79 @@
+#include <gtk/gtk.h>
+#include <math.h>
+
+#define WIDTH 320
+#define HEIGHT 240
+#define GAP (HEIGHT / 20)
+#define r GAP
+#define visual_length (HEIGHT - 2 * GAP - r)
+
+#define phi0 (-0.5)
+#define omega0 0.0
+#define t0 0.0
+#define g 9.81
+#define l 1.0
+#define dt 0.02
+
+double t = t0;
+double phi = phi0;
+double omega= omega0;
+
+void draw_pendulum (cairo_t *c, double phi, GdkRGBA *colour)
+{
+  int x = WIDTH / 2 + visual_length * sin (phi);
+  int y = GAP + visual_length * cos (phi);
+
+  gdk_cairo_set_source_rgba (c, colour);
+  cairo_move_to (c, WIDTH / 2, GAP);
+  cairo_line_to (c, x, y);
+  cairo_stroke (c);
+  cairo_arc (c, x, y, r, 0, 2 * G_PI);
+  cairo_fill (c);
+}
+
+gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
+{
+  GdkRGBA blue   = { 0.0, 0.5, 1.0, 1.0 };
+  GdkRGBA green  = { 0.0, 0.5, 0.0, 1.0 };
+
+  double A = phi0;
+  double B = 0.5 * M_PI;  /* 90° */
+  double phi_analytic = A * sin (sqrt (g / l) * t + B);
+
+  draw_pendulum (c, phi, &blue);
+  draw_pendulum (c, phi_analytic, &green);
+
+  return FALSE;
+}
+
+gboolean timer (GtkWidget *widget)
+{
+  t += dt;
+  phi += omega * dt;
+  omega += - dt * g / l * sin (phi);
+
+  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
+  g_timeout_add (50, (GSourceFunc) timer, widget);
+  return FALSE;
+}
+
+int main (int argc, char **argv)
+{
+  gtk_init (&argc, &argv);
+
+  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_widget_show (window);
+  gtk_window_set_title (GTK_WINDOW (window), "Hello");
+  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
+
+  GtkWidget *drawing_area = gtk_drawing_area_new ();
+  gtk_widget_show (drawing_area);
+  gtk_container_add (GTK_CONTAINER (window), drawing_area);
+  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
+  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
+
+  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
+
+  gtk_main ();
+  return 0;
+}
diff --git a/20231130/pendulum-3.c b/20231130/pendulum-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..b6bc9793b3b7c0166df678cccdf8a4ae9170d886
--- /dev/null
+++ b/20231130/pendulum-3.c
@@ -0,0 +1,87 @@
+#include <gtk/gtk.h>
+#include <math.h>
+
+#define WIDTH 320
+#define HEIGHT 240
+#define GAP (HEIGHT / 20)
+#define r GAP
+#define visual_length (HEIGHT - 2 * GAP - r)
+
+#define phi0 (-0.5)
+#define omega0 0.0
+#define t0 0.0
+#define g 9.81
+#define l 1.0
+#define dt 0.02
+
+double t = t0;
+double phi_with_sin = phi0;
+double omega_with_sin= omega0;
+double phi_without_sin = phi0;
+double omega_without_sin= omega0;
+
+void draw_pendulum (cairo_t *c, double phi, GdkRGBA *colour)
+{
+  int x = WIDTH / 2 + visual_length * sin (phi);
+  int y = GAP + visual_length * cos (phi);
+
+  gdk_cairo_set_source_rgba (c, colour);
+  cairo_move_to (c, WIDTH / 2, GAP);
+  cairo_line_to (c, x, y);
+  cairo_stroke (c);
+  cairo_arc (c, x, y, r, 0, 2 * G_PI);
+  cairo_fill (c);
+}
+
+gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data)
+{
+  GdkRGBA blue   = { 0.0, 0.5, 1.0, 1.0 };
+  GdkRGBA orange = { 1.0, 0.5, 0.0, 1.0 };
+  GdkRGBA green  = { 0.0, 0.5, 0.0, 1.0 };
+
+  double A = phi0;
+  double B = 0.5 * M_PI;  /* 90° */
+  double phi_analytic = A * sin (sqrt (g / l) * t + B);
+
+                                                 /* Näherungen: Kleinwinkel  dt  */
+  draw_pendulum (c, phi_with_sin, &blue);        /*    blau       nein       ja  */
+  draw_pendulum (c, phi_without_sin, &orange);   /*    orange      ja        ja  */
+  draw_pendulum (c, phi_analytic, &green);       /*    grün        ja       nein */
+
+  return FALSE;  /* TRUE to stop other handlers from being invoked for the event.
+                    FALSE to propagate the event further. */
+}
+
+gboolean timer (GtkWidget *widget)
+{
+  t += dt;
+  phi_with_sin += omega_with_sin * dt;
+  omega_with_sin += - dt * g / l * sin (phi_with_sin);
+  phi_without_sin += omega_without_sin * dt;
+  omega_without_sin += - dt * g / l * phi_without_sin;
+
+  gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT);
+  g_timeout_add (50, (GSourceFunc) timer, widget);
+  return FALSE;
+}
+
+int main (int argc, char **argv)
+{
+  gtk_init (&argc, &argv);
+
+  GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_widget_show (window);
+  gtk_window_set_title (GTK_WINDOW (window), "Hello");
+  g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
+
+  GtkWidget *drawing_area = gtk_drawing_area_new ();
+  gtk_widget_show (drawing_area);
+  gtk_container_add (GTK_CONTAINER (window), drawing_area);
+  gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT);
+  g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);
+
+  g_timeout_add (50, (GSourceFunc) timer, drawing_area);
+
+  gtk_main ();
+  return 0;
+}