Ejemplo n.º 1
0
def umnozhaj(fak1, fak2):
    """
    Multipliziert fak1 und fak2 nach der russischen Bauernmethode

    fak1 und fak2 müssen natürliche Zahlen sein

    """

    # Dumme Eingaben abfangen
    if not is_natural(fak1) or not is_natural(fak2):
        raise Exception("Russische Bauern brauchen und können nur" + " natürliche Zahlen multiplizieren.")

    # Akkumulator initialisieren
    if is_even(fak1):  # bei gerader Zahl in der ersten Spalte
        prod = 0
    else:
        prod = fak2

    # Iterieren, bis fak1 0 oder 1 erreicht hat
    while fak1 > 1:
        # fak1 ganzzahlig durch zwei teilen
        fak1 >>= 1

        # fak2 mit zwei multiplizieren
        fak2 <<= 1

        # Bei gerader Zahl in der ersten Spalte zweite Spalte streichen
        if is_even(fak1):
            pass
        # Bei ungerader Zahl zum Ergebnis addieren
        else:
            prod += fak2

    return prod
Ejemplo n.º 2
0
def binomk_iter(n, k):
    """
    Berechnet den Binomialkoeffizienten n über k iterativ

    Die Berechnung ist an die explizite Formel angelehnt. -- Sie zieht die
    Faktoren aus den Fakultäten auseinander, dividiert also erst und
    multipliziert dann.

    """

    # Dumme Eingaben abfangen
    if not is_natural(n) or not is_natural(k):
        raise Exception("n und k müssen natürliche Zahlen sein")

    # Nach Definition:
    if k > n:
        return 0

    # Binomialkoeffizienten berechnen
    res = 1
    for i in range(1, k+1):
        res *= n / i
        n -= 1  # Einfaches Dekrement ist schneller als explizite Subtraktion

    return int(res)
Ejemplo n.º 3
0
def binomk_naiv(n, k):
    """
    Berechnet den Binomialkoeffizienten n über k naiv und rekursionsfrei

    Benutzt wird die Formel (n k) = n! / ((n-k)! * k!).

    """

    # Dumme Eingaben abfangen
    if not is_natural(n) or not is_natural(k):
        raise Exception("n und k müssen natürliche Zahlen sein")

    # Nach Definition:
    if k > n:
        return 0
    else:
        return fac_iter(n) // (fac_iter(n - k) * fac_iter(k))
Ejemplo n.º 4
0
def pow_iter(base, expon):
    """
    Berechnet endrekursiv base^expon für natürliche Zahlen

    0^0 wird als 1 festgelegt.

    """

    # Dumme Eingaben abfangen
    if not is_natural(base) or not is_natural(expon):
        raise Exception("Basis und Exponent müssen natürliche Zahlen sein")

    # Potenz berechnen
    prod = 1
    for factor_nr in range(expon):
        prod *= base

    return prod
Ejemplo n.º 5
0
def pow_rek(base, expon):
    """
    Berechnet endrekursiv base^expon für natürliche Zahlen

    0^0 wird als 1 festgelegt.

    """

    # Dumme Eingaben abfangen
    if not is_natural(base) or not is_natural(expon):
        raise Exception("Basis und Exponent müssen natürliche Zahlen sein")

    # rekursive Hilfsfunktion mit kumulativem Parameter definieren
    def pow_helper(prod, base, expon):
        if expon == 0:
            return prod
        else:
            return pow_helper(prod * base, base, expon - 1)

    # Aufruf der Hilfsfunktion
    return pow_helper(1, base, expon)
Ejemplo n.º 6
0
    def _check(self, job):
        """
        Check whether input tuple is valid job

        """

        priority = job[1]
        if not (number.is_natural(priority) and 1 <= priority <= 100):
            raise Exception("Priority must be natural number between 1 and "
                            + " 100")

        return
Ejemplo n.º 7
0
def binomk_rek(n, k):
    """
    Berechnet den Binomialkoeffizienten n über k über die rekursive Formel

    """

    # Dumme Eingaben abfangen
    if not is_natural(n) or not is_natural(k):
        raise Exception("n und k müssen natürliche Zahlen sein")

    # Nach Definition:
    if k > n:
        return 0

    # Rekursionsanker setzen
    if k == 0:
        return 1
    if k == 1:
        return n

    # Bühne frei für Rekursion
    return binomk_rek(n-1, k-1) + binomk_rek(n-1, k)
Ejemplo n.º 8
0
def fac_iter(n):
    """
    Berechnet die Fakultät der Zahl n iterativ

    """

    # Dumme Eingaben abfangen
    if not is_natural(n):
        raise Exception("Wir berechnen nur Fakultäten von natürlichen"
                        + " Zahlen. Für andere Zahlenbereiche ist die"
                        + " Gammafunktion zu verwenden.")

    # Fakultät berechnen
    factorial = 1 # 0! = 1
    for factor in range(2, n+1):
        factorial *= factor

    return factorial
Ejemplo n.º 9
0
def draw_mm_fractal(size, filename):
    """
    Schreibt ein Mickey-Mouse-Fraktal in eine Postscript-Datei

    Parameter:
        size ... "Größe" des Bildes. Da wir es mit Vektorgrafiken zu tun
                 haben, bestimmt der Parameter hauptsächlich die
                 Rekusionstiefe und damit die Detailliertheit des Bildes.
        filename
             ... Name der Datei, in die geschrieben werden soll
    Rückgabe: Nüschts

    """

    # Dumme Eingaben abfangen
    if not number.is_natural(size):
        raise Exception("Bildgröße muss eine natürliche Zahl sein.")
    if not isinstance(filename, str):
        raise Exception("Dateiname muss ein String sein.")

    # Größe der kleinsten Kreise an Bildgröße anpassen
    resolution = 610 / size

    def rec_circles(x_0, y_0, size):
        """
        Schreibt rekursiv die Befehle für die Kreise des Fraktals

        Parameter:
            x_0, y_0 ... Koordinaten des linken unteren Punktes des Feldes für
                         die aktuelle Rekursion
            size     ... größe des Feldes für die aktuelle Rekursion

        Die Funktion schreibt einen Kreis in jeden Quadranten des aktuellen
        Bildfeldes und ruft sich dann für jeden Quadranten rekursiv auf.

        """

        # Größe der Felder für nächsttiefere Rekursionsebene
        half_size = size / 2

        if size > resolution:
            # Kreis in die linke untere Ecke und rekursiv kleine Kreise
            fillCircle( x_0 +     size, y_0 +     size, size)
            rec_circles(x_0,            y_0,            half_size)

            # Kreis in die rechte untere Ecke und rekursiv kleine Kreise
            fillCircle( x_0 + 3 * size, y_0 +     size, size)
            rec_circles(x_0 + 2 * size, y_0,             half_size)

            # Kreis in die linke obere Ecke und rekursiv kleine Kreise
            fillCircle( x_0 +     size, y_0 + 3 * size, size)
            rec_circles(x_0,            y_0 + 2 * size, half_size)

            # Kreis in die rechte obere Ecke und rekursiv kleine Kreise
            fillCircle( x_0 + 3 * size, y_0 + 3 * size, size)
            rec_circles(x_0 + 2 * size, y_0 + 2 * size, half_size)
        else:
            return


    # Header schreiben
    begin(filename, size, size)

    # Schwarz als Farbe für überall definieren
    setColor(0, 0, 0)

    # großen schwarzen Klecks in die Mitte
    half_size = size / 2
    fillCircle(half_size, half_size, half_size)

    # kleine Kreise rekursiv
    rec_circles(0, 0, size / 2)

    # PS-Datei abschließen
    end()

    return