02. Podstawy matematyki#

Tresci kształcenia. Celem zajęć jest zaprezentowanie studentom podstawowych pojęć matematycznych takich jak definicja, twierdzenie, implikacja, założenie, teza, implikacja odwrotna, warunek konieczny, warunek dostateczny. Rodzaje dowodów (na przykładach dowodu twierdzenia Pitagorasa i niewymierności pierwiastka z dwóch) – dowody „nie wprost”.

Efekty kształcenia. Student potrafi poprawnie formułować wypowiedzi matematyczne, wyróżniać założenia i tezy twierdzeń oraz przenosić tę wiedzę na algorytmy i sprawdzanie ich poprawności. Potrafi dobrać odpowiedni do twierdzenia typ dowodu i go zastosować.

Wstęp#

Matematyka, podobnie jak każda nauka operuje własnym językiem, w którym formułowane są elementy teorii matematycznej - aksjomaty, twierdzenia, wnioski, hipotezy, wzory, dowody, etc. Język ten jest swoisty dla danego działu matematyki, ale zawiera również pewne elementy stałe.

Tymi stałymi elementami są rachunek zdań i predykatów oraz elementy teorii zbiorów (tzw. teorii mnogości). Działem, który zajmuje się badaniem zdań jest logika matematyczna.

Można byłoby zadać naturalne pytanie czy takie “formalne” podejście i tworzenie sztucznego języka jest rzeczywiście konieczne?

Okazuje się, że tak. Historia matematyki pokazała, że w pewnym momencie, gdy teorie matematyczne bardzo się rozrosły i brakowało solidnych podstaw matematyki, odkrywano rozmaite nieścisłości i antynomie, czyli najogólniej mówiąc zdania ilustrujące sprzeczności w teorii. W odpowiedzi na to, należało nowoczesną (XX-wieczną) matematykę zbudować na “trwałych fundamentach”, którymi są właśnie teoria mnogości i logika matematyczna.

Jakie ma to znaczenie dla informatyka? Zasadnicze. Informatyk “komunikując się” z komputerem musi również używać podobnego, precyzyjnego języka, w swojej naturze bardzo podobnego do języka matematyki i opartego na logice.

Elementy logiki matematycznej#

Zdaniem (w sensie logiki) nazywamy takie zdanie oznajmujące, o którym możemy powiedzieć, że jest prawdziwe lub fałszywe (np. Słoń jest ssakiem). Prawdziwość bądź fałszywość zdania nazywamy jego wartością logiczną i oznaczamy odpowiednio przez \(1\) - prawda i \(0\) - fałsz. Zwykle zdania oznaczamy małymi literami alfabetu (bywa, że z indeksami):

\[ p,q,r,\dots \quad \mathtt{lub} \quad p_1,p_2,p_3,\dots\; . \]

Zatem zdaniami w sensie logicznym będą wyrażenia:

  • Warszawa nie jest stolicą Polski.

  • Człowiek jest ssakiem.

  • Luty ma 31 dni.

Z kolei wyrażenia:

  • Ile masz lat?

  • Być albo nie być; oto jest pytanie.

nie są zdaniami w sensie logicznym.

Podobnie jak w języku polskim, ze zdań ,,pojedynczych” możemy konstruować zdania złożone. Wykorzystujemy do tego celu spójniki logiczne. Wyróżnaniamy pięć najważniejszych spójników zdaniowych:

  • jednoargumentowy spójnik negacji \(\neg\)

  • dwuargumentowe spójniki: koniunkcji \(\wedge\), alernatywy \(\vee\), implikacji \(\Rightarrow\) i równoważności \(\iff\).

Zdefiniowane powyżej operacje logiczne odpowiadają w języku polskim następującym spójnikom zdaniowym:

  • \(\neg p\) - nieprawda, że \(p\),

  • \(p \wedge q\) - \(p\) i \(q\),

  • \(p \vee q\) - \(p\) lub \(q\),

  • \(p \Rightarrow q\) - jeśli \(p\), to \(q\),

  • \(p \iff q\) - \(p\) wtedy i tylko wtedy, gdy \(q\).

Zasadniczym pytaniem jest teraz w jaki sposób od prawdziwości zdań \(p\) i \(q\) zależy prawdziwość zdań utworzonych przy pomocy powyższych spójników. Informacje o tym daje nam tabela.

import pandas as pd
logical_table = pd.DataFrame(data={'p':[1,1,0,0], 'q':[1,0,1,0], 'p ∧ q': [1,0,0,0], 
                                   'p ⇒ q': [1,0,1,1], 'p ⟺ q': [1,0,0,1]})
logical_table
p q p ∧ q p ⇒ q p ⟺ q
0 1 1 1 1 1
1 1 0 0 0 0
2 0 1 0 1 0
3 0 0 0 1 1
negation_table = pd.DataFrame(data = {'p':[1,0], '¬p':[0,1]})
negation_table
p ¬p
0 1 0
1 0 1

Za pomocą powyższych spójników możemy jeszcze bardziej “komplikować” zdania:

\[ (p \wedge q) \implies (\neg r \iff q), \]
\[ (r \vee s) \iff [\neg(\neg p \iff q) \implies q]. \]

Doprecyzujmy, że gdy rozważamy tego typu wyrażenia bez odniesienia do konkretnych zdań (tu - \(p\), \(q\), \(r\), \(s\)), to mówić będziemy o formułach zdaniowych, a \(p\), \(q\), \(r\) i \(s\) nazywać będziemy zmiennymi zdaniowymi.

Jednym z podstawowych zagadnień jest pytanie o wartość logiczną całej formuły w zależności od wartości zmiennych zdaniowych. Dla przykładu rozważmy formułę:

\[ \neg(p \vee q) \iff (\neg p \wedge \neg q). \]

Spróbujmy zbadać wartość logiczną takiej formuły dla wszystkich możliwych wartości przyjmowanych przez zmienne \(p\) i \(q\). Zbudujemy w tym celu tzw. tabelę prawdy.

logical_table1 = pd.DataFrame(data={'p':[1,1,0,0], 'q':[1,0,1,0], 
                              '¬ p':[0,0,1,1], '¬ q':[0,1,0,1],
                              'p ∨ q':[1,1,1,0], '¬(𝑝∨𝑞)':[0,0,0,1],
                              '¬𝑝∧¬𝑞':[0,0,0,1], '¬(𝑝∨𝑞)⟺(¬𝑝∧¬𝑞)':[1,1,1,1]})
logical_table1
p q ¬ p ¬ q p ∨ q ¬(𝑝∨𝑞) ¬𝑝∧¬𝑞 ¬(𝑝∨𝑞)⟺(¬𝑝∧¬𝑞)
0 1 1 0 0 1 0 0 1
1 1 0 0 1 1 0 0 1
2 0 1 1 0 1 0 0 1
3 0 0 1 1 0 1 1 1

Widzimy, że dla każdej możliwej pary wartości logicznych przyjmowanych przez zmienne \(p\) i \(q\) wartość logiczna formuły

\[ \neg(p \vee q) \iff (\neg p \wedge \neg q) \]

wynosi \(1\), a zatem zawsze jest ona prawdziwa!

Spróbujmy wykonać kolejny przykład:

\[ (p \vee q \vee \neg r) \Rightarrow r. \]

Tym razem mamy trzy zmienne zdaniowe, każda z nich przyjmuje jedną z dwóch wartości logicznych co nam daje \(2^3=8\) możliwych realizacji. Każdą taką funkcję, która wartościom logicznym zmiennych zdaniowych przyporządkowuje wartość logiczną formuły nazywać będziemy wartościowaniem. Zatem jeśli formuła zawiera \(n\) zmiennych, to mamy \(2^n\) wartościowań. Należy o tym pamiętać budując tabelę prawdy. Sporządźmy dla formuły \((p \vee q \vee \neg r) \Rightarrow r\) taką tabelę.

logical_table3 = pd.DataFrame(data={'p':[1,1,1,1,0,0,0,0], 'q':[1,1,0,0,1,1,0,0], 'r':[1,0,1,0,1,0,1,0],
                                    '¬r':[0,1,0,1,0,1,0,1], 'p∨q∨¬r':[1,1,1,1,1,1,0,1], 
                                    '(p∨q∨¬r)⇒r':[1,0,1,0,1,0,1,0]})
logical_table3
p q r ¬r p∨q∨¬r (p∨q∨¬r)⇒r
0 1 1 1 0 1 1
1 1 1 0 1 1 0
2 1 0 1 0 1 1
3 1 0 0 1 1 0
4 0 1 1 0 1 1
5 0 1 0 1 1 0
6 0 0 1 0 0 1
7 0 0 0 1 1 0

Tym razem widzimy, że są również takie wartościowania, dla których powyższa formuła przyjmuje wartość fałszywą. Formuła poprzednia jest przykładem tzw. tautologii rachunku zdań, czyli formuły, która przyjmuje wartość prawdziwą przy każdym możliwym wartościowaniu.

Umiejętność stosowania spójników logicznych lub ujmując to “bardziej informatycznie” - operatorów logicznych - jest niezwykle ważna z punktu widzenia programisty. Większość języków programowania posiada typ zmiennej logicznej i operatory odpowiadające spójnikom logicznym. Pozwalają one kreować i kontrolować programiście właściwy przepływ programu. Są sytuacje, w których potrzebujemy sprawdzić czy zachodzi wiele warunków jednocześnie albo alternatywa kilku warunków itp. Wtedy właśnie należy wykorzystać operatory logiczne, których działanie jest takie jak zdefiniowanych spójników.

Przykład#

Spośród liczb od 1 do 100 wypisać wszystkie

  • podzielne przez \(4\),

  • podzielne przez \(6\),

  • podzielne przez \(4\) i \(6\),

  • podzielne przez \(4\) lub \(6\),

  • podzielne przez \(4\) lub \(6\) i jednocześnie niepodzielne przez \(36\).

x = [i for i in range(101)]
x4 = [i for i in x if i % 4 == 0]
x6 = [i for i in x if i % 6 == 0]
x4_and_6 = [i for i in x if ((i % 6 == 0) and (i % 4 == 0))]
x4_or_6 = [i for i in x if ((i % 6 == 0) or (i % 4 == 0))]
x46_not36 = [i for i in x if ((i % 6 == 0) or (i % 4 == 0)) and not(i % 36 == 0)]
x4
[0,
 4,
 8,
 12,
 16,
 20,
 24,
 28,
 32,
 36,
 40,
 44,
 48,
 52,
 56,
 60,
 64,
 68,
 72,
 76,
 80,
 84,
 88,
 92,
 96,
 100]
x6
[0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96]
x4_and_6
[0, 12, 24, 36, 48, 60, 72, 84, 96]
x4_or_6
[0,
 4,
 6,
 8,
 12,
 16,
 18,
 20,
 24,
 28,
 30,
 32,
 36,
 40,
 42,
 44,
 48,
 52,
 54,
 56,
 60,
 64,
 66,
 68,
 72,
 76,
 78,
 80,
 84,
 88,
 90,
 92,
 96,
 100]
x46_not36
[4,
 6,
 8,
 12,
 16,
 18,
 20,
 24,
 28,
 30,
 32,
 40,
 42,
 44,
 48,
 52,
 54,
 56,
 60,
 64,
 66,
 68,
 76,
 78,
 80,
 84,
 88,
 90,
 92,
 96,
 100]

Analiza tabelki spójników logicznych pozwala zauważyć, że spośród spójników dwuargumentowych wszystkie oprócz implikacji są przemienne. Stąd też mówimy o poprzedniku i następniku implikacji. Implikacja ma jeszcze jedną ważną własność - odpowiada matematycznemu rozumieniu pojęcia wynikanie. Choć może się to wydawać na początku zaskakujące, implikacja jest prawdziwa (jak to wynika z tabeli prawdy) zawsze gdy poprzednik jest fałszywy. Prawdziwe jest więc zdanie

Jeśli Kraków jest stolicą Polski, to Słońce krąży wokół Ziemi.

jak również

Jeśli Kraków jest stolicą Polski, to Ziemia krąży wokół Słońca.

Fałszywe jest natomiast następujące zdanie:

Jeśli Ziemia krąży wokół Słońca, to Kraków jest stolicą Polski.

Ostatnie dwa z powyższych przykładów ilustrują nieprzemienność implikacji.

Kwantyfikatory#

Okazuje się, że sam rachunek zdań nie jest wystarczający, do tego, aby stanowił on model języka matematycznego. Potrzebne jest rozbudowanie tego języka jeszcze o pewne elementy. Należą do nich m. in. kwantyfikatory.
Kwantyfikatorem ogólnym (dużym, uniwersalnym) wiążącym zmienną \(x\) nazywamy wyrażenie: dla każdego \(x\). Oznaczamy go symbolem

\[ \forall_x. \]

Kwantyfikatorem szczegółowym (małym, egzystencjalnym) wiążącym zmienną \(x\) nazywamy wyrażenie: istnieje \(x\). Oznaczamy go symbolem

\[ \exists_x. \]

Wyrażenie

\[ \exists_{x \in \mathbb{Z}}(x^2=1) \]

oznacza, że równanie

\[ x^2=1 \]

ma rozwiązania całkowite. Osobną kwestią jest ilość tych rozwiązań.

Z kolei wyrażenie

\[ \forall_{x \in \mathbb{R}\setminus \{1\}}\bigg(\frac{2x-2}{x-1}=2\bigg) \]

oznacza, że każda liczba rzeczywista różna od \(1\) jest rozwiązaniem równania

\[ \frac{2x-2}{x-1}=2. \]

Podstawowe elementy teorii matematycznej#

Pojęcia pierwotne, definicje, aksjomaty i twierdzenia#

Wiemy już mniej więcej jakiego typu zdania będą pojawiały się w matematyce. Kolejnym krokiem jest przeznaczenie tych zdań - budowanie teorii. Matematycy budując jakąś teorię potrzebują, mówiąc bardziej obrazowo, różnych elementów konstrukcji. Do najbardziej podstawowych pojęć matematyki należą pojęcia pierwotne - czyli pojęcia, których się nie definiuje. Pojęciem pierwotnym jest np. pojęcie zbioru czy punktu. Pojęcia pierwotne mogą być różne w różnych matematycznych teoriach. Kolejnym elementem “konstrukcji” są definicje pojęć czyli zdania za pomocą których ustalamy nazwę i znaczenie danego pojęcia. W definicji możemy odwoływać się tylko do zdefiniowanych uprzednio pojęć oraz pojęć pierwotnych.

Przyjrzyjmy się poniższej definicji.

Okręgiem nazywamy zbiór wszystkich punktów równoodległych od danego punktu.

Choć definicja wydaje się intuicyjnie poprawna, to jednak brakuje jej kilku istotnych elementów. Definiowanym pojęciem jest okrąg. Nie znamy kontekstu, więc dobrze byłoby napisać “na płaszczyźnie”. Zwróćmy również uwagę na pojęcia pierwotne i pojęcia, które pojawiają się w powyższej definicji okręgu - zbiór, punkt, odległość. O ile zbiór i punkt są z pewnością pojęciami pierwotnymi, tak uściślenia (formalnie definicji) wymagałoby pojęcie odległości, które jak się okazuje może w zasadniczy sposób wpłynąć na kształt definiowanego okręgu.

Odpowiednia kolejność definiowania pojęć używanych w danej definicji nie gwarantuje nam poprawności definicji i istnienia obiektu definiowanego. Muszą istnieć pewne dodatkowe ograniczenia (zasady) tworzenie poprawnych obiektów i zdań w matematyce. Dlatego wyróżnia się w matematyce aksjomaty czyli pewne z założenia prawdziwe zdania tzn. takie, których się nie uzasadnia, a z których wynikać mają wszystkie inne prawdziwe zdania - twierdzenia danej teorii.

Może zatem okazać się, że zaproponowana definicja jest po prostu sprzeczna, bo jej istnienie przeczyłoby któremuś z aksjomatów czy twierdzeń.

Różnica między aksjomatem, a twierdzeniem jest taka, że twierdzenie musi w logiczny sposób wynikać z aksjomatów lub innych twierdzeń. Innymi słowy wymaga matematycznego dowodu prawdziwości (w oparciu o istniejące aksjomaty i twierdzenia).

Twierdzenia matematyczne mają zasadniczo postać implikacji czasem bardzo rozbudowanej, lub kilku implikacji.

Twierdzenie Pitagorasa#

Jeżeli trójkąt jest prostokątny, to suma kwadratów przyprostokątnych jest równa kwadratowi przeciwprostokątnej. Innymi słowy

\[ a^2 + b^2 = c^2. \]

Jeśli przyjmiemy, że zmienna zdaniowa \(p\) oznacza zdanie trójkąt jest prostokątny, zaś zmienna \(q\) - zdanie - suma kwadratów przyprostokątnych jest równa kwadratowi przeciwprostokątnej, to twierdzenie Pitagorasa ma postać implikacji

\[ p \implies q. \]

Poprzednik implikacji nazywamy założeniem twierdzenia, zaś następnik - tezą twierdzenia. Oczywiście dla większości twierdzeń teza nie jest bezpośrednim i oczywistym wnioskiem z założenia. Stąd też dowody twierdzeń (o których mówić będziemy za chwilę) bywają niejednokrotnie bardzo złożone, a “wymyślenie” ich zajmuje nawet dziesięciolecia lub stulecia!

Twierdzenie odwrotne, przeciwne i przeciwstawne#

Przypuśćmy, że pewne twierdzenie \(T\) dane jest w postaci implikacji, tzn.

\[ T \colon p \Rightarrow q. \]

Twierdzeniem odwrotnym do \(T\) nazywamy twierdzenie postaci \(q \Rightarrow p\). Zauważmy, że w twierdzeniu odwrotnym implikacja zmienia swój “kierunek”. Jest to tzw. implikacja odwrotna.

Twierdzeniem przeciwnym do \(T\) nazywamy twierdzenie postaci \(\neg p \Rightarrow \neg q\).

Twierdzeniem przeciwstawnym do \(T\) nazywamy twierdzenie postaci \(\neg q \Rightarrow \neg p\).

W ramach ćwiczenia zastanówmy się, czy któreś z równoważności

\[ (p \implies q) \iff (q \implies p), \]
\[ (p \implies q) \iff (\neg p \implies \neg q), \]
\[ (p \implies q) \iff (\neg q \implies \neg p) \]

są prawdziwe. Zbudujmy tabelę prawdy dla ostatniej z nich.

logical_table4 = pd.DataFrame(data={'p':[1,1,0,0], 'q':[1,0,1,0], 
                              '¬ p':[0,0,1,1], '¬ q':[0,1,0,1],
                              'p ⇒ q': [1,0,1,1], '¬q ⇒ ¬p':[1,0,1,1],
                              '(𝑝⟹𝑞)⟺(¬𝑞⟹¬𝑝)':[1,1,1,1]     
                                   })
logical_table4
p q ¬ p ¬ q p ⇒ q ¬q ⇒ ¬p (𝑝⟹𝑞)⟺(¬𝑞⟹¬𝑝)
0 1 1 0 0 1 1 1
1 1 0 0 1 0 0 1
2 0 1 1 0 1 1 1
3 0 0 1 1 1 1 1

Z uzyskanej tabeli wynika, że twierdzenie \(T\) oraz twierdzenie przeciwstawne do \(T\) są (logicznie) równoważne. Twierdzenia odwrotne i przeciwne do \(T\) też są wzajemnie równoważne, jednak żadne z nich nie musi być równoważne twierdzeniu \(T\).

Spróbujmy w ramach kolejnego ćwiczenia sformułować twierdzenie odwrotne, przeciwne i przeciwstawne do twierdzenia Pitagorasa i ocenić wartość logiczną każdego z tych twierdzeń.

Twierdzenie odwrotne: Jeżeli suma kwadratów długości dwóch boków trójkąta jest równa kwadratowi długości trzeciego boku, to trójkąt ten jest prostokątny.

Twierdzenie przeciwne: Jeżeli trójkąt nie jest prostokątny, to suma kwadratów przyprostokątnych jest różna od kwadratu przeciwprostokątnej.

Twierdzenie odwrotne: Jeżeli suma kwadratów długości dwóch boków trójkąta jest różna od kwadratu długości trzeciego boku, to trójkąt ten nie jest prostokątny.

Doskonale wiemy ze szkoły, że oprócz Twierdzenia Pitagorasa prawdziwe jest twierdzenie do niego odwrotne. Stąd uwzględniając fakt, że oba twierdzenia są prawdziwe prawdziwe będą twierdzenia do nich przeciwstawne. Zatem wszystkie cztery twierdzenia są prawdziwe. Moglibyśmy to podsumować następująco:

Twierdzenie#

Trójkąt jest prostokątny wtedy i tylko wtedy, gdy

\[ a^2 +b^2 =c^2. \]

Warunek konieczny i dostateczny#

Jeżeli ze zdania \(p\) wynika zdanie \(q\), czyli implikacja \(p \implies q\) jest prawdziwa, to mówimy, że zdanie \(p\) jest warunkiem dostatecznym dla \(q\), zaś zdanie \(q\) jest warunkiem koniecznym dla \(p\).

Istotnie, z faktu, że implikacja jest prawdziwa, wynika, że prawdziwość poprzednika gwarantuje prawdziwość następnika. Z drugiej strony, na to, aby \(p\) było prawdziwe (gdy \(p \implies q\) jest prawdziwe) koniecznym jest, aby prawdziwe było również \(q\).

Spróbujmy rozstrzygnąć następujące problemy:

  • Liczba \(n\) jest podzielna przez \(24\). Czy jest to warunek konieczny/dostateczny podzielności przez \(4\) i przez \(6\)?

  • Odwrotnie - czy podzielność danej liczby przez \(4\) i \(6\) jest konieczna/wystarczająca do podzielności przez \(24\) ?

Widzimy zatem, że podzielność przez \(24\) jest warunkiem dostatecznym (ale nie koniecznym) podzielności przez \(4\) i przez \(6\). Podzielność przez \(6\) i \(4\) jest warunkiem koniecznym (ale nie dostatecznym) podzielności przez \(24\). Łatwo wywnioskować, że podzielność przez \(12\) jest warunkiem koniecznym i dostatecznym podzielności przez \(4\) i przez \(6\).

Dowody twierdzeń#

Jak już zostało wyżej wspomniane, w matematyce każde twierdzenie czyli zdanie prawdziwe, które nie jest aksjomatem, wymaga uzasadnienia, które nazywamy dowodem twierdzenia.
Istnieje wiele sposobów dowodzenia twierdzeń. Najbardziej naturalny wydaje się być dowodzenie metodą “wprost”, które nieco upraszczając, polega na tym, aby zbudować taki ciąg formuł danej teorii, w którym ostatnie z nich jest tezą dowodzonego twierdzenia. Każdy kolejny element tego ciągu musi logicznie wynikać z poprzednich jego elementów.
Inną techniką dowodową jest metoda “nie wprost”. Zasadniczą częścią tej metody jest przypuszczenie (na początku), że teza tego twierdzenia jest fałszywa i wykazaniu, że przypuszczenie to prowadzi do sprzeczności.

Zilustrujmy obie metody na prostych przykładach.

Dowód twierdzenia Pitagorasa#

Rozważmy trójkąt prostokątny o przyprostokątnych długości \(a\) i \(b\) oraz przeciwprostokątnej długości \(c\). Przedłużmy bok długości \(a\) o długość \(b\), zaś bok długości \(b\) o długość \(a\). Oba boki są prostopadłe, możemy więc skonstruować kwadrat o boku długości \(a+b\). Następnie prowadząc wewnątrz kwadratu z wierzchołków kątów ostrych odcinki prostopadłe do przeciwprostokątnej trójkąta oraz łącząc punkty, w których odcinki te przecinają odpowiednie boki kwadratu otrzymujemy mniejszy kwadrat (o boku \(c\)) wpisany w kwadrat utworzony uprzednio.

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8,8))

x = [0,2,2,0,0]
y = [0,0,2,2,0]
x1 =[0.5,2, 1.5, 0, 0.5]
y2 =[0, 0.5, 2, 1.5, 0]

plt.axis('off')
plt.plot(x1,y2)
_ = plt.plot(x,y)
_images/02_wstep_mat_32_0.png

Aby udowodnić twierdzenie wystarczy porównać wzory na pole obliczone dwiema metodami:

  • \(P = (a+b)^2\)

  • \(P = 4 \cdot \frac{1}{2} \cdot a \cdot b + c^2\)

Otrzymujemy stąd równość

\[ a^2 + 2ab + b^2 = c^2 + 2ab, \]

skąd

\[ a^2 + b^2 = c^2, \]

co kończy dowód.

Kolejny dowód - niewymierności pierwiastka z liczby \(3\) - przeprowadzimy metodą nie wprost.

Dowód niewymierności liczby \(\sqrt{3}\)#

Dla dowodu nie wprost przypuśćmy, że liczba \(\sqrt{3}\) jest wymierna. Możemy zatem zapisać ją w postaci ułamka nieskracalnego \(\frac{m}{n}\), gdzie \(m,n \in \mathbb{Z}\), \(n \neq 0\). Mamy zatem \(\sqrt{3} = \frac{m}{n}\). Po podniesieniu tej równości do kwadratu i przemnożeniu obustronnie przez \(n^2\) dostajemy

\[ 3n^2 = m^2. \]

Zauważmy, że liczba po lewej stronie równości jest podzielna przez \(3\), zatem \(m^2\) jest również podzielna przez \(3\). Co więcej również \(m\) jest podzielne przez \(3\). Istnieje więc taka liczba całkowita \(l\), że \(m = 3l\). Po podstawieniu do pierwszej z równości otrzymujemy

\[ 3 n^2 = 9 l^2, \]

a stąd

\[ n^2 = 3 l^2. \]

Argumentując jak poprzednio dostajemy, że również liczba \(n\) jest podzielna przez \(3\). Obie zatem liczby \(m\) i \(n\) są podzielne przez \(3\), co przeczy temu, że ułamek był nieskracalny. A zatem przypuszczenie, że liczba \(\sqrt{3}\) jest wymierna było fałszywe. Liczba \(\sqrt 3\) jest zatem niewymierna.

Istnieje jeszcze wiele innych technik dowodowych, które będziemy systematycznie poznawać - dowód indukcyjny, dowód kombinatoryczny, itp. Zobaczymy także inne rodzaje dowodów - np. dowody konstrukcyjne czy dowody niekonstruktywne. Z pewnością pozwoli nam to rozwinąć aparat matematyczny, a przez to także informatyczny.