Parę implementacji matematycznych w Python #2.

Posted in 1 sierpnia, 2020 by

Categories: Matematyka Programowanie Python

Tags: , , ,

Reading Time: 7 minutes

Ten artykuł jest kontynuacją poprzedniego artykułu o tym samym tytule. Jeśli jeszcze nie zapoznałeś się z nim tutaj masz link 🙂 . W tej grupie artykułów skupiam się na implementacjach z dziedziny matematyki. Na razie zaczynamy od najłatwiejszych problemów oraz zagadnień. Głównym tematem są liczby jak to w matematyce. A zatem zaczynamy.

Silnia w Python. Liczby …

Zdjęcie przedstawiające kolorowe liczby.

Silnia jest jednym z najłatwiejszych zagadnień do zaimplementowania w dowolnym języku programowania. Silnia to po prostu mnożenie przez siebie liczb naturalnych od 1 do n, gdzie n to liczba której silnie obliczamy.

Czyli dla na przykład liczby 3, mamy 1 * 2 * 3 = 6. Dla liczby 5 będzie to natomiast 1 * 2 * 3 * 4 * 5 = 120. I tak dalej. Żeby skrócić zapis silnię zapisuje się przy pomocy znaku “!”. Tak więc silnią z 5 będzie 5!, a silnią z 3 będzie 3!.

Implementacja.

Zdjęcie przedstawiające implementację czegoś.

Poniżej znajduje się metoda silnia przyjmująca liczbę naturalną. Na początku sprawdzamy czy jest to liczba naturalna większa od 0. Czy 0 jest liczbą naturalną? Jest to pytanie na które możesz odpowiedzieć w komentarzu.

Następnie definiujemy zmienną iloczyn który będzie naszą silnią. Ostatnia rzecz którą robimy to przechodzimy w pętli po każdej liczbie naturalnej od 1 do n, gdzie n to nasza liczba dla której obliczamy silnie.

W pętli po prostu liczymy silnie czyli przy pierwszej iteracji będzie liczone iloczyn = 1 * 2, następnie drugi obieg pętli to będzie iloczyn = 2 * 3 ponieważ teraz iloczyn to liczba 2. I tak dalej aż do ostatniej iteracji.

def silnia(number):
    if number <= 0:
        exit("Liczba musi być większa od 0 i musi być typu int.")
    iloczyn = 1
    for n in range(2, number + 1):
        iloczyn *= n
    return iloczyn

for i in range(1, 11):
    print("{}! = {}".format(i, silnia(i)))

Oto wyniki naszej funkcji 🧐  :

Zdjęcie wyniku konsoli przedstawiające nam wyniki silni dla liczb od 1 do 10.

Liczby Doskonałe w Python.

Zdjęcie przedstawiające liczby w dziwnej konfiguracji.

Liczby doskonałe są dość rzadkie. W przedziale od 1 do 10000 są tylko 4 liczby doskonałe. Możesz sprawdzić jakie uruchamiając skrypt z tego rozdziału.

Liczba doskonała to taka liczba naturalna która jest sumą wszystkich swoich dzielników właściwych czyli dzielników które są liczbami mniejszymi od liczby doskonałej 😎 .

Wikipedia

Żeby zobaczyć czy dana liczba naturalna jest liczbą doskonałą musimy wpierw znaleźć wszystkie jej dzielniki właściwe. Następnie te dzielniki dodać do siebie i zobaczyć czy otrzymana suma jest równa tej liczbie.

Implementacja.

Zdjęcie przedstawiające tablicę z napisem Make Things Happen - czyli implementacja.

Poniższa funkcja daje nam na wyjściu wszystkie dzielniki liczby przekazanej jako argument.

def get_factors(x):
    return_list = []
    for i in range(1, x):
        if x % i == 0:
            return_list.append(i)
    return return_list

W funkcji tworzymy pustą listę a w pętli sprawdzamy czy liczba, której szukamy dzielników, dzieli się bez reszty przez kolejne liczby począwszy od 1 do naszej liczby.

Jeśli dzieli się to dodajemy ten dzielnik do naszej listy, po czym listę zwracamy z funkcji.

Dla liczby 20 dostaniemy wynik [1, 2, 4, 5, 10] 😌 :

factors = get_factors(20)
print(factors)
Wynik funkcji get_factors dla liczby 20 zwracający nam tablicę z wartościami 1, 2, 4, 5 i 10.

Tak jak pisałem powyżej liczby doskonałe występują rzadko. W zakresie od 1 do 10000 jest ich tylko 4. A zatem stwórzmy listę zawierającą liczby od 1 do 10000.

candidate_list = list(range(1, 10001))

Szukanie Liczb Doskonałych.

Skorzystamy z funkcji biblioteki itertools. Biblioteka ta została stworzona do pracy z generatorami w języku Python.

Używa się jej tam gdzie mamy dość dużą złożoność obliczeń do wykonania czyli na przykład podczas analizy danych.

Importujemy ją poleceniem 👇 :

import itertools as it

Żeby do listy filtered_list dodać 4 liczby doskonałe, których szukamy, użyjemy funkcji filterfalse wyżej wspomnianej biblioteki.

Funkcja ta przyjmuje w pierwszym argumencie warunek który musi zostać spełniony żeby elementy z drugiego argumentu czyli obiektu iterable (lista, słownik itd.) został zwrócony, czyli zapisany w naszej liście filtered_list.

Używamy tutaj wyrażenia lambda która jest funkcją bez nazwy. Za jej pomocą sprawdzamy czy x, czyli liczba pobrana z listy candidate_list nie jest równa sumie dzielników tej liczby 👍 .

lambda x: x != sum(get_factors(x))

Czyli na przykład funkcja filterfalse przy 20-tej iteracji pobierze z listy candidate_list, liczbę 20 i sprawdza wynik sum(get_factors(20)) jest sumą liczb 1, 2, 4, 5, i 10.

Wynosi ona 22 więc liczba 20 nie zostanie zapisana w liście filtered_list ponieważ 22 != 20 🤓 .

filtered_list = list(it.filterfalse(lambda x: x != sum(get_factors(x)), candidate_list))

Pod sam koniec możemy wypisać do konsoli liczby doskonałe które znaleźliśmy.

for filtered in filtered_list:
    print("{} - {}".format(filtered, get_factors(filtered)))
Wynik pętli która wypisała nam wszystkie liczby doskonałe w przedziale od 1 do 10000. Są to liczby 6, 28, 496 oraz 8128.

Jak widać w zadanym przedziale są 4 liczby doskonałe: 6, 28, 496 oraz 8128 😎 .

Czy Trójkąt jest Prostokątny. Dalej Liczby …

Wszyscy znamy bardzo dobrze Twierdzenie Pitagorasa. Jest ono wałkowane już w podstawówce.

W tym przykładzie sprawdzimy czy trójkąt o danych bokach a, b i c jest prostokątny za pomocą tego twierdzenia.

Twierdzenie Pitagorasa.

Dla przypomnienia Twierdzenie Pitagorasa mówi o tym że:

Kwadrat przeciwprostokątnej trójkąta prostokątnego jest równy sumie kwadratów jego przyprostokątnych 🤨 .

Pitagoras
Zdjęcie przedstawiające twierdzenie Pitagorasa i równania na trójkąt prostokątny.

A więc aby sprawdzić czy trójkąt jest prostokątny musimy podnieść do kwadratu wartość przeciwprostokątnej i porównać otrzymaną wartość z sumą kwadratów wartości przyprostokątnych.

Implementacja.

W tym celu posłuży nam poniższa funkcja 👇 :

import math

# Sprawdzamy czy trójkąt jest prostokątny.
def isTriangle(a, b, c):
    sides = [a, b, c]

    hypotenuse = max(sides)
    sides.remove(hypotenuse)
    cathetus1 = sides[0]
    cathetus2 = sides[1]

    return math.pow(hypotenuse, 2) == math.pow(cathetus1, 2) + math.pow(cathetus2, 2)

Funkcja przyjmuje 3 argumenty które są bokami trójkąta. Tworzymy z nich listę aby wyłonić przeciwprostokątną poleceniem max.

Następnie usuwamy przeciwprostokątną z listy i do zmiennych cathetus1 i cathetus2 wpisujemy przyprostokątne.

Ostatnim krokiem jest zwrócenie wartości True lub False.

Jest ona wynikiem równania z Twierdzenia Pitagorasa. Jeśli trójkąt jest prostokątny zwracamy True, w przeciwnym razie zwracamy False 😉 .

Wyniki.

Oto kilka przykładów wywołania tej funkcji:

import math
from termcolor import colored

print("*" * 30)

# rectangular triangle - True
text = colored(str(isTriangle(5, 4, 3)), "blue" if isTriangle(5, 4, 3) else "red")
sides = colored("5, 4, 3", "yellow")
print(f"Is triangle {sides} rectangular triangle? {text}")
print("Because: ")
print(f"5^2 = 4^2 + 3^2")
print(f"{math.pow(5, 2)} == {math.pow(4, 2)} + {math.pow(3, 2)}")
print(f"{math.pow(5, 2)} == {math.pow(4, 2) + math.pow(3, 2)}")

print("*" * 30)

Wynik funkcji isTriangle dla boków 5, 4, 3 który zwraca True.

Żeby było ciekawiej dołączyłem do kodu moduł termcolor.

Pozwala on na kolorowanie Stringów wypisywanych w konsoli lub daje możliwość wypisania ich na kolorowym tle.

Hurra 😋 ! Jak widać w tym przykładzie trójkąt o bokach 3, 4 i 5 jest trójkątem prostokątnym.

Dajmy jeszcze jeden przykład👇 :

import math
from termcolor import colored

print("*" * 30)

# rectangular triangles - False
text = colored(str(isTriangle(7, 4, 10)), "blue" if isTriangle(7, 4, 10) else "red")
sides = colored("7, 4, 10", "yellow")
print(f"Is triangle {sides} rectangular triangle? {text}")
print("Because: ")
print(f"10^2 = 7^2 + 4^2")
print(f"{math.pow(10, 2)} == {math.pow(7, 2)} + {math.pow(4, 2)}")
print(f"{math.pow(10, 2)} == {math.pow(7, 2) + math.pow(4, 2)}")

print("*" * 30)
Wynik funkcji isTriangle dla boków 7, 4, 10 który zwraca False.

W tym przykładzie widać że trójkąt o bokach 7, 4 i 10 nie jest trójkątem prostokątnym. Dzięki Pitagorasie 😌 !

Warto jeszcze dodać że do funkcji isTriangle możemy przekazać argumenty, czyli boki, w dowolnej kolejności.

Nie musi to być od największego do najmniejszego gdyż w implementacji uwzględniliśmy ten szczegół.

Kończąc …

W tym blog poście przybliżyłem parę prostych implementacji matematycznych w języku Python.

Język ten świetnie się nadaje do zastosowań matematycznych co widać między innymi w dziedzinie Big Data oraz Data Science.

Jeśli jeszcze nie przeczytałeś pierwszego artykułu z tej serii tutaj masz linka do niego.

Jeśli interesujesz się matematyką, lubisz czytać blogi matematyczne mogę ci polecić blog o tej tematyce który czytam.

Jest to blog Krzysztofa StencelProstaMatematyka.pl.

Jest tam naprawdę bardzo dużo ciekawych artykułów które na pewno poszerzą twoją wiedzę z matematyki 🙂 .

Jeśli zauważyłeś w tym artykule jakieś błędy możesz zwrócić mi uwagę o nich poprzez formularz kontaktowy lub w komentarzu.

Jeśli spodobał ci się ten artykuł będę bardzo wdzięczny za zostawienie komentarza, udostępnienie go na social media lub danie kciuka w górę 👍 . Kontakt z czytelnikami mojego bloga jest naprawdę bardzo mobilizujący do dalszej pracy. Więc zapraszam do kontaktu.

To zdjęcie przedstawia tablicę z napisem Time To Say Goodbye.

Hej!


One thought on “Parę implementacji matematycznych w Python #2.”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

19 + sixteen =