Skip to content

Instantly share code, notes, and snippets.

@halexus
Last active March 15, 2019 10:43
Show Gist options
  • Save halexus/bdf56ce35b8afa15f75bafce03dfd2ed to your computer and use it in GitHub Desktop.
Save halexus/bdf56ce35b8afa15f75bafce03dfd2ed to your computer and use it in GitHub Desktop.
Python Lösung von Beispiel 10 Wahrscheinlichkeitstheorie
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Beispiel 10"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"(a) Wie viele Zahlen der Menge $M = \\{1, 2, 3, \\dots, 1000 \\}$ sind\n",
"\n",
"i. durch 3 teilbar?\n",
" \n",
"ii. durch 3 oder 5 teilbar?\n",
" \n",
"iii. durch 3 oder 5 oder 7 teilbar?\n",
"\n",
"iv. durch 3 oder 5 oder 7 oder 9 teilbar?\n",
"\n",
"***"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Lösung\n",
"Im ersten Schritt erzeugen wir die Menge $M$ der natürlichen Zahlen von 1 bis 1000 mithilfe des [`range`](https://docs.python.org/3.7/library/stdtypes.html#range) Befehls, wobei zu beachten ist, dass die obere Grenze *exklusive* ist."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"M = range(1, 1001)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Die vier Aufgaben i. bis iv. sind nun alle auf sehr ähnliche Weise mithilfe von [*set comprehensions*](https://docs.python.org/3.7/tutorial/datastructures.html?highlight=set%20comprehension#list-comprehensions) zu lösen. Wir iterieren über alle Elemente $\\in M$ und testen für jede Zahl ob die entsprechende Teilbarkeitseigenschaft aus i. bis iv. zutrifft. Jene Elemente welche die entsprechende Teilbarkeitseigenschaft erfüllen werden der neuen Menge hinzugefügt. Danach wird die Mächtigkeit (also in diesem Fall von endlichen Mengen die Anzahl der Elemente) mit der [`len`](https://docs.python.org/3.7/library/functions.html?len#len) Funktion ermittelt.\n",
"\n",
"Es folgen drei Varianten um die vier Fragen mit Python zu lösen."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Variante 1\n",
"### i. durch 3 teilbar?\n",
"\n",
"Mathematische Formulierung als Mächtigkeit einer Menge:\n",
"$$\\#\\{x \\in M: 3 \\mid x\\}$$\n",
"\n",
"In Python ist die Übersetzung dieser Zeile:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"333"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len({x for x in M if x%3 == 0})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`{x for x in M if Eigenschaft}` kann man sich verbal als *\"Die Menge aller x in der Menge M, welche die Eigenschaft erfüllen\"* vorstellen.\n",
"\n",
"Um in Python eine Teilbarkeitseigenschaft zu formulieren verwenden wir den Operator `%`. Dieser liefert den Rest einer ganzzahligen Division. Die Aussage *a teilt b*, in Zeichen $a \\mid b$, ist genau dann wahr, wenn die ganzzahlige Division $b:a$ den Rest 0 lässt.\n",
"\n",
"Man erkennt, dass die Schreibweise die man in Python zur Erzeugung einer Menge verwendet, sehr nahe an der mathematischen ist."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ii. durch 3 oder 5 teilbar?\n",
"\n",
"Mathematische Formulierung als Mächtigkeit einer Menge:\n",
"$$\\#\\{x \\in M: 3 \\mid x \\vee 5 \\mid x\\}$$\n",
"\n",
"Mit Python wieder als direkte Übersetzung davon:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"467"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len({x for x in M if x%3 == 0 or x%5 == 0})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## iii. durch 3 oder 5 oder 7 teilbar?"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"543"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len({x for x in M if x%3 == 0 or x%5 == 0 or x%7 == 0})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## iv. durch 3 oder 5 oder 7 oder 9 teilbar?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Da die Anzahl an zu erfüllenden Bedingungen wächst, besteht die Möglichkeit anstatt vieler logischer Verknüpfungen mit `or`, eine Liste aller Bedingungen zu erstellen und die [`any`](https://docs.python.org/3.7/library/functions.html#any) Funktion mit dieser Liste als Argument aufzurufen. `any` liefert den Wahrheitswert `True` falls mindestens ein Argument `True` ist, wirkt also wie eine `or` Verknüpfung aller Listenelemente."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"543"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len({x for x in M if any([x%3 == 0, x%5 == 0, x%7 == 0, x%9 == 0])})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Variante 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Die Menge $M$ wird wie oben mit der `range` Funktion erzeugt.\n",
"\n",
"Wir erstellen die Menge der natürlichen Zahlen von 1 bis 1000 die durch 3 teilbar sind. Zusätzlich erzeugen wir die Menge der Zahlen die durch 5 teilbar sind. Für die Zahlen 7 und 9 erzeugen wir ebenfalls die entsprechenden Mengen."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"teilbar_durch_3 = {x for x in M if x%3 == 0}\n",
"teilbar_durch_5 = {x for x in M if x%5 == 0}\n",
"teilbar_durch_7 = {x for x in M if x%7 == 0}\n",
"teilbar_durch_9 = {x for x in M if x%9 == 0}"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"333"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(teilbar_durch_3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Um die Anzahl der Elemente in der Menge der Zahlen, die durch 3 *oder* 5 teilbar sind zu ermitteln, wäre der naive Ansatz einfach die Summe der Anzahl der Zahlen die durch 3 teilbar sind mit der Anzahl der Zahlen die durch 5 teilbar sind zu berechnen. So würden aber die Zahlen die durch beide teilbar sind (z.B. 15) doppelt gezählt.\n",
"\n",
"Um das zu umgehen, nutzen wir die Eindeutigkeitseigenschaft von Mengen. In Mengen ist jedes Element eindeutig, es kommen keine mehrfach vor. Bei der Vereinigung von Mengen sind all jene Elemente die in mehreren Mengen vorkommen nur einmal im Ergebnis enthalten.\n",
"\n",
"Bei unserem Beispiel kommt zum Beispiel die Zahl *15* sowohl in der Menge der Zahlen die durch 3 teilbar, als auch in jener die durch 5 teilbar sind vor. In der Vereinigungsmenge kommt 15 aber nur einmal vor.\n",
"\n",
"Für die Vereinigung von Mengen bietet Python den `|` Operator."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"467"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(teilbar_durch_3|teilbar_durch_5)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"543"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(teilbar_durch_3|teilbar_durch_5|teilbar_durch_7)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"543"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(teilbar_durch_3|teilbar_durch_5|teilbar_durch_7|teilbar_durch_9)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Variante 3 - Verwendung der Siebformel"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Im Folgenden werden alle, in der Siebformel vorkommenden, Mengen und Schnittmengen gezeigt.\n",
"\n",
"Da 3 ein Teiler von 9 ist, gilt dass die Menge `teilbar_durch_9` eine Teilmenge von `teilbar_durch_3` ist. Ist eine Zahl durch 9 teilbar, so ist sie immer auch durch 3 teilbar.\n",
"\n",
"Python bietet mit dem [`<=`](https://docs.python.org/3/library/stdtypes.html#frozenset.issubset) Operator die Möglichkeit zu testen ob eine Menge eine Teilmenge einer anderen Menge ist."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"teilbar_durch_9 <= teilbar_durch_3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Aus diesem Grund ist es eigentlich nicht notwendig bei iv. die Siebformel zu verwenden, da die gleiche Anzahl an Elementen wie bei iii. herauskommt. Der Vollständigkeit halber geben wir aber trotzdem alle Mengen an, um auch die Aufgabe iv. lösen zu können wenn man diese Eigenschaft nicht erkannt hat."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nun geben wir zuerst jene Mengen aus die mit keiner anderen geschnitten werden."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99, 102, 105, 108, 111, 114, 117, 120, 123, 126, 129, 132, 135, 138, 141, 144, 147, 150, 153, 156, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 189, 192, 195, 198, 201, 204, 207, 210, 213, 216, 219, 222, 225, 228, 231, 234, 237, 240, 243, 246, 249, 252, 255, 258, 261, 264, 267, 270, 273, 276, 279, 282, 285, 288, 291, 294, 297, 300, 303, 306, 309, 312, 315, 318, 321, 324, 327, 330, 333, 336, 339, 342, 345, 348, 351, 354, 357, 360, 363, 366, 369, 372, 375, 378, 381, 384, 387, 390, 393, 396, 399, 402, 405, 408, 411, 414, 417, 420, 423, 426, 429, 432, 435, 438, 441, 444, 447, 450, 453, 456, 459, 462, 465, 468, 471, 474, 477, 480, 483, 486, 489, 492, 495, 498, 501, 504, 507, 510, 513, 516, 519, 522, 525, 528, 531, 534, 537, 540, 543, 546, 549, 552, 555, 558, 561, 564, 567, 570, 573, 576, 579, 582, 585, 588, 591, 594, 597, 600, 603, 606, 609, 612, 615, 618, 621, 624, 627, 630, 633, 636, 639, 642, 645, 648, 651, 654, 657, 660, 663, 666, 669, 672, 675, 678, 681, 684, 687, 690, 693, 696, 699, 702, 705, 708, 711, 714, 717, 720, 723, 726, 729, 732, 735, 738, 741, 744, 747, 750, 753, 756, 759, 762, 765, 768, 771, 774, 777, 780, 783, 786, 789, 792, 795, 798, 801, 804, 807, 810, 813, 816, 819, 822, 825, 828, 831, 834, 837, 840, 843, 846, 849, 852, 855, 858, 861, 864, 867, 870, 873, 876, 879, 882, 885, 888, 891, 894, 897, 900, 903, 906, 909, 912, 915, 918, 921, 924, 927, 930, 933, 936, 939, 942, 945, 948, 951, 954, 957, 960, 963, 966, 969, 972, 975, 978, 981, 984, 987, 990, 993, 996, 999]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_3))"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 310, 315, 320, 325, 330, 335, 340, 345, 350, 355, 360, 365, 370, 375, 380, 385, 390, 395, 400, 405, 410, 415, 420, 425, 430, 435, 440, 445, 450, 455, 460, 465, 470, 475, 480, 485, 490, 495, 500, 505, 510, 515, 520, 525, 530, 535, 540, 545, 550, 555, 560, 565, 570, 575, 580, 585, 590, 595, 600, 605, 610, 615, 620, 625, 630, 635, 640, 645, 650, 655, 660, 665, 670, 675, 680, 685, 690, 695, 700, 705, 710, 715, 720, 725, 730, 735, 740, 745, 750, 755, 760, 765, 770, 775, 780, 785, 790, 795, 800, 805, 810, 815, 820, 825, 830, 835, 840, 845, 850, 855, 860, 865, 870, 875, 880, 885, 890, 895, 900, 905, 910, 915, 920, 925, 930, 935, 940, 945, 950, 955, 960, 965, 970, 975, 980, 985, 990, 995, 1000]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_5))"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 98, 105, 112, 119, 126, 133, 140, 147, 154, 161, 168, 175, 182, 189, 196, 203, 210, 217, 224, 231, 238, 245, 252, 259, 266, 273, 280, 287, 294, 301, 308, 315, 322, 329, 336, 343, 350, 357, 364, 371, 378, 385, 392, 399, 406, 413, 420, 427, 434, 441, 448, 455, 462, 469, 476, 483, 490, 497, 504, 511, 518, 525, 532, 539, 546, 553, 560, 567, 574, 581, 588, 595, 602, 609, 616, 623, 630, 637, 644, 651, 658, 665, 672, 679, 686, 693, 700, 707, 714, 721, 728, 735, 742, 749, 756, 763, 770, 777, 784, 791, 798, 805, 812, 819, 826, 833, 840, 847, 854, 861, 868, 875, 882, 889, 896, 903, 910, 917, 924, 931, 938, 945, 952, 959, 966, 973, 980, 987, 994]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_7))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[9, 18, 27, 36, 45, 54, 63, 72, 81, 90, 99, 108, 117, 126, 135, 144, 153, 162, 171, 180, 189, 198, 207, 216, 225, 234, 243, 252, 261, 270, 279, 288, 297, 306, 315, 324, 333, 342, 351, 360, 369, 378, 387, 396, 405, 414, 423, 432, 441, 450, 459, 468, 477, 486, 495, 504, 513, 522, 531, 540, 549, 558, 567, 576, 585, 594, 603, 612, 621, 630, 639, 648, 657, 666, 675, 684, 693, 702, 711, 720, 729, 738, 747, 756, 765, 774, 783, 792, 801, 810, 819, 828, 837, 846, 855, 864, 873, 882, 891, 900, 909, 918, 927, 936, 945, 954, 963, 972, 981, 990, 999]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_9))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nun alle 6 Mengen die der Durchschnitt von zwei Mengen sind."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, 285, 300, 315, 330, 345, 360, 375, 390, 405, 420, 435, 450, 465, 480, 495, 510, 525, 540, 555, 570, 585, 600, 615, 630, 645, 660, 675, 690, 705, 720, 735, 750, 765, 780, 795, 810, 825, 840, 855, 870, 885, 900, 915, 930, 945, 960, 975, 990]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_3 & teilbar_durch_5))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[21, 42, 63, 84, 105, 126, 147, 168, 189, 210, 231, 252, 273, 294, 315, 336, 357, 378, 399, 420, 441, 462, 483, 504, 525, 546, 567, 588, 609, 630, 651, 672, 693, 714, 735, 756, 777, 798, 819, 840, 861, 882, 903, 924, 945, 966, 987]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_3 & teilbar_durch_7))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[9, 18, 27, 36, 45, 54, 63, 72, 81, 90, 99, 108, 117, 126, 135, 144, 153, 162, 171, 180, 189, 198, 207, 216, 225, 234, 243, 252, 261, 270, 279, 288, 297, 306, 315, 324, 333, 342, 351, 360, 369, 378, 387, 396, 405, 414, 423, 432, 441, 450, 459, 468, 477, 486, 495, 504, 513, 522, 531, 540, 549, 558, 567, 576, 585, 594, 603, 612, 621, 630, 639, 648, 657, 666, 675, 684, 693, 702, 711, 720, 729, 738, 747, 756, 765, 774, 783, 792, 801, 810, 819, 828, 837, 846, 855, 864, 873, 882, 891, 900, 909, 918, 927, 936, 945, 954, 963, 972, 981, 990, 999]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_3 & teilbar_durch_9))"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[35, 70, 105, 140, 175, 210, 245, 280, 315, 350, 385, 420, 455, 490, 525, 560, 595, 630, 665, 700, 735, 770, 805, 840, 875, 910, 945, 980]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_5 & teilbar_durch_7))"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[45, 90, 135, 180, 225, 270, 315, 360, 405, 450, 495, 540, 585, 630, 675, 720, 765, 810, 855, 900, 945, 990]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_5 & teilbar_durch_9))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[63, 126, 189, 252, 315, 378, 441, 504, 567, 630, 693, 756, 819, 882, 945]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_7 & teilbar_durch_9))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Alle vier Mengen die der Durchschnitt von drei Mengen sind."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[105, 210, 315, 420, 525, 630, 735, 840, 945]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_3 & teilbar_durch_5 & teilbar_durch_7))"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[45, 90, 135, 180, 225, 270, 315, 360, 405, 450, 495, 540, 585, 630, 675, 720, 765, 810, 855, 900, 945, 990]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_3 & teilbar_durch_5 & teilbar_durch_9))"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[63, 126, 189, 252, 315, 378, 441, 504, 567, 630, 693, 756, 819, 882, 945]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_3 & teilbar_durch_7 & teilbar_durch_9))"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[315, 630, 945]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_5 & teilbar_durch_7 & teilbar_durch_9))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Durchschnitt von vier Mengen"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[315, 630, 945]\n"
]
}
],
"source": [
"print(sorted(teilbar_durch_3 & teilbar_durch_5 & teilbar_durch_7 & teilbar_durch_9))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"Es war sehr aufwendig und fehleranfällig im letzten Abschnitt alle möglichen Kombinationen an Durchschnitten von Mengen zu schreiben. Es wäre viel besser, wenn wir die Möglichkeit hätten eine Liste an Mengen zu schreiben von der dann automatisch alle möglichen Durchschnitte berechnet werden. Genau dies wird im folgenden (fortgeschrittenen) Code gezeigt. Dieser Code hat den Vorteil, dass der Liste `alle_mengen` einfach beliebig viele weitere Mengen hinzugefügt werden können, und dann automatisch alle möglichen Schnittmengen aller möglichen Anzahlen an Teilmengen gebildet werden."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Alle Mengen die sich als Schnitt von 1 Mengen ergeben: \n",
"[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99, 102, 105, 108, 111, 114, 117, 120, 123, 126, 129, 132, 135, 138, 141, 144, 147, 150, 153, 156, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 189, 192, 195, 198, 201, 204, 207, 210, 213, 216, 219, 222, 225, 228, 231, 234, 237, 240, 243, 246, 249, 252, 255, 258, 261, 264, 267, 270, 273, 276, 279, 282, 285, 288, 291, 294, 297, 300, 303, 306, 309, 312, 315, 318, 321, 324, 327, 330, 333, 336, 339, 342, 345, 348, 351, 354, 357, 360, 363, 366, 369, 372, 375, 378, 381, 384, 387, 390, 393, 396, 399, 402, 405, 408, 411, 414, 417, 420, 423, 426, 429, 432, 435, 438, 441, 444, 447, 450, 453, 456, 459, 462, 465, 468, 471, 474, 477, 480, 483, 486, 489, 492, 495, 498, 501, 504, 507, 510, 513, 516, 519, 522, 525, 528, 531, 534, 537, 540, 543, 546, 549, 552, 555, 558, 561, 564, 567, 570, 573, 576, 579, 582, 585, 588, 591, 594, 597, 600, 603, 606, 609, 612, 615, 618, 621, 624, 627, 630, 633, 636, 639, 642, 645, 648, 651, 654, 657, 660, 663, 666, 669, 672, 675, 678, 681, 684, 687, 690, 693, 696, 699, 702, 705, 708, 711, 714, 717, 720, 723, 726, 729, 732, 735, 738, 741, 744, 747, 750, 753, 756, 759, 762, 765, 768, 771, 774, 777, 780, 783, 786, 789, 792, 795, 798, 801, 804, 807, 810, 813, 816, 819, 822, 825, 828, 831, 834, 837, 840, 843, 846, 849, 852, 855, 858, 861, 864, 867, 870, 873, 876, 879, 882, 885, 888, 891, 894, 897, 900, 903, 906, 909, 912, 915, 918, 921, 924, 927, 930, 933, 936, 939, 942, 945, 948, 951, 954, 957, 960, 963, 966, 969, 972, 975, 978, 981, 984, 987, 990, 993, 996, 999]\n",
"\n",
"[5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220, 225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 310, 315, 320, 325, 330, 335, 340, 345, 350, 355, 360, 365, 370, 375, 380, 385, 390, 395, 400, 405, 410, 415, 420, 425, 430, 435, 440, 445, 450, 455, 460, 465, 470, 475, 480, 485, 490, 495, 500, 505, 510, 515, 520, 525, 530, 535, 540, 545, 550, 555, 560, 565, 570, 575, 580, 585, 590, 595, 600, 605, 610, 615, 620, 625, 630, 635, 640, 645, 650, 655, 660, 665, 670, 675, 680, 685, 690, 695, 700, 705, 710, 715, 720, 725, 730, 735, 740, 745, 750, 755, 760, 765, 770, 775, 780, 785, 790, 795, 800, 805, 810, 815, 820, 825, 830, 835, 840, 845, 850, 855, 860, 865, 870, 875, 880, 885, 890, 895, 900, 905, 910, 915, 920, 925, 930, 935, 940, 945, 950, 955, 960, 965, 970, 975, 980, 985, 990, 995, 1000]\n",
"\n",
"[7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 98, 105, 112, 119, 126, 133, 140, 147, 154, 161, 168, 175, 182, 189, 196, 203, 210, 217, 224, 231, 238, 245, 252, 259, 266, 273, 280, 287, 294, 301, 308, 315, 322, 329, 336, 343, 350, 357, 364, 371, 378, 385, 392, 399, 406, 413, 420, 427, 434, 441, 448, 455, 462, 469, 476, 483, 490, 497, 504, 511, 518, 525, 532, 539, 546, 553, 560, 567, 574, 581, 588, 595, 602, 609, 616, 623, 630, 637, 644, 651, 658, 665, 672, 679, 686, 693, 700, 707, 714, 721, 728, 735, 742, 749, 756, 763, 770, 777, 784, 791, 798, 805, 812, 819, 826, 833, 840, 847, 854, 861, 868, 875, 882, 889, 896, 903, 910, 917, 924, 931, 938, 945, 952, 959, 966, 973, 980, 987, 994]\n",
"\n",
"[9, 18, 27, 36, 45, 54, 63, 72, 81, 90, 99, 108, 117, 126, 135, 144, 153, 162, 171, 180, 189, 198, 207, 216, 225, 234, 243, 252, 261, 270, 279, 288, 297, 306, 315, 324, 333, 342, 351, 360, 369, 378, 387, 396, 405, 414, 423, 432, 441, 450, 459, 468, 477, 486, 495, 504, 513, 522, 531, 540, 549, 558, 567, 576, 585, 594, 603, 612, 621, 630, 639, 648, 657, 666, 675, 684, 693, 702, 711, 720, 729, 738, 747, 756, 765, 774, 783, 792, 801, 810, 819, 828, 837, 846, 855, 864, 873, 882, 891, 900, 909, 918, 927, 936, 945, 954, 963, 972, 981, 990, 999]\n",
"\n",
"Alle Mengen die sich als Schnitt von 2 Mengen ergeben: \n",
"[15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, 285, 300, 315, 330, 345, 360, 375, 390, 405, 420, 435, 450, 465, 480, 495, 510, 525, 540, 555, 570, 585, 600, 615, 630, 645, 660, 675, 690, 705, 720, 735, 750, 765, 780, 795, 810, 825, 840, 855, 870, 885, 900, 915, 930, 945, 960, 975, 990]\n",
"\n",
"[21, 42, 63, 84, 105, 126, 147, 168, 189, 210, 231, 252, 273, 294, 315, 336, 357, 378, 399, 420, 441, 462, 483, 504, 525, 546, 567, 588, 609, 630, 651, 672, 693, 714, 735, 756, 777, 798, 819, 840, 861, 882, 903, 924, 945, 966, 987]\n",
"\n",
"[9, 18, 27, 36, 45, 54, 63, 72, 81, 90, 99, 108, 117, 126, 135, 144, 153, 162, 171, 180, 189, 198, 207, 216, 225, 234, 243, 252, 261, 270, 279, 288, 297, 306, 315, 324, 333, 342, 351, 360, 369, 378, 387, 396, 405, 414, 423, 432, 441, 450, 459, 468, 477, 486, 495, 504, 513, 522, 531, 540, 549, 558, 567, 576, 585, 594, 603, 612, 621, 630, 639, 648, 657, 666, 675, 684, 693, 702, 711, 720, 729, 738, 747, 756, 765, 774, 783, 792, 801, 810, 819, 828, 837, 846, 855, 864, 873, 882, 891, 900, 909, 918, 927, 936, 945, 954, 963, 972, 981, 990, 999]\n",
"\n",
"[35, 70, 105, 140, 175, 210, 245, 280, 315, 350, 385, 420, 455, 490, 525, 560, 595, 630, 665, 700, 735, 770, 805, 840, 875, 910, 945, 980]\n",
"\n",
"[45, 90, 135, 180, 225, 270, 315, 360, 405, 450, 495, 540, 585, 630, 675, 720, 765, 810, 855, 900, 945, 990]\n",
"\n",
"[63, 126, 189, 252, 315, 378, 441, 504, 567, 630, 693, 756, 819, 882, 945]\n",
"\n",
"Alle Mengen die sich als Schnitt von 3 Mengen ergeben: \n",
"[105, 210, 315, 420, 525, 630, 735, 840, 945]\n",
"\n",
"[45, 90, 135, 180, 225, 270, 315, 360, 405, 450, 495, 540, 585, 630, 675, 720, 765, 810, 855, 900, 945, 990]\n",
"\n",
"[63, 126, 189, 252, 315, 378, 441, 504, 567, 630, 693, 756, 819, 882, 945]\n",
"\n",
"[315, 630, 945]\n",
"\n",
"Alle Mengen die sich als Schnitt von 4 Mengen ergeben: \n",
"[315, 630, 945]\n",
"\n"
]
}
],
"source": [
"import itertools\n",
"\n",
"alle_mengen = [teilbar_durch_3, teilbar_durch_5, teilbar_durch_7, teilbar_durch_9]\n",
"\n",
"for i in range(1, len(alle_mengen)+1):\n",
" print(\"Alle Mengen die sich als Schnitt von\", i, \"Mengen ergeben: \")\n",
" schnittmengen = [sorted(set.intersection(*x)) for x in itertools.combinations(alle_mengen, i)]\n",
" for schnittmenge in schnittmengen:\n",
" print(schnittmenge)\n",
" print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nun geben wir statt der expliziten Mengen, die Anzahl der entsprechenden Elemente aus:"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Anzahl der Elemente in allen Mengen die sich als Schnitt von 1 Mengen ergeben: \n",
"333\n",
"200\n",
"142\n",
"111\n",
"Summe: 786\n",
"Anzahl der Elemente in allen Mengen die sich als Schnitt von 2 Mengen ergeben: \n",
"66\n",
"47\n",
"111\n",
"28\n",
"22\n",
"15\n",
"Summe: 289\n",
"Anzahl der Elemente in allen Mengen die sich als Schnitt von 3 Mengen ergeben: \n",
"9\n",
"22\n",
"15\n",
"3\n",
"Summe: 49\n",
"Anzahl der Elemente in allen Mengen die sich als Schnitt von 4 Mengen ergeben: \n",
"3\n",
"Summe: 3\n"
]
}
],
"source": [
"for i in range(1, len(alle_mengen)+1):\n",
" print(\"Anzahl der Elemente in allen Mengen die sich als Schnitt von\", i, \"Mengen ergeben: \")\n",
" schnittmengen = [sorted(set.intersection(*x)) for x in itertools.combinations(alle_mengen, i)]\n",
" for schnittmenge in schnittmengen:\n",
" print(len(schnittmenge))\n",
" print(\"Summe:\", sum(len(x) for x in schnittmengen))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Schließlich addieren wir die Summen mit den passenden Vorzeichen:"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"543\n"
]
}
],
"source": [
"ergebnis = 0\n",
"for i in range(1, len(alle_mengen)+1):\n",
" schnittmengen = [sorted(set.intersection(*x)) for x in itertools.combinations(alle_mengen, i)]\n",
" ergebnis += (-1)**(i+1)* sum(len(x) for x in schnittmengen)\n",
"print(ergebnis)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment