/*
 * $Id: TextMiningUtils.java,v 1.2 2003/04/22 12:52:42 lawern Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: TextMiningUtils.java,v $
 * Revision 1.2  2003/04/22 12:52:42  lawern
 * ggT wird jetzt nicht mehr rekursiv berechnet
 *
 * Revision 1.1  2003/04/22 11:02:39  lawern
 * Initiale Version
 *
 *
 */
package vkc.util;

public class TextMiningUtils {
    /**
     * Grösten gemeinsamen Teiler aller Zahlen des übergebenen Arrays unter
     * Berücksichtigung der Genauigkeit precision berechnen. Wenn die Liste
     * absteigend sortiert ist beschleunigt dies die Berechnung.
     *
     * @param list Liste von Zahlen zu der der ggT berechnet werden soll
     * @param precision Genauigkeit mit der berechnet werden soll
     *
     * @return gröster gemeinsamen Teiler aller Zahlen des übergebenen Arrays
     */
    public static final int ggT(int[] list, int precision) {
        //letzten Eintrag in der Liste der finden der ungleich 0 ist
        int i;
        int ggT = 1;

        for (i = list.length - 1; i >= 0; i--) {
            if (list[i] != 0) {
                break;
            }
        }

        //ggT berechnen
        if (i > 0) {
            ggT = list[i];

            for (int j = --i; j >= 0; j--) {
                if (list[j] != 0) {
                    ggT = ggT(list[j], ggT, precision);
                }
            }
        }

        //System.out.println("ggT: " + ggT);
        return ggT;
    }

    /**
     * Grösten gemeinsamen Teiler zweier Zahlen unter Berücksichtigung der
     * Genauigkeit precision berechnen.
     *
     * @param m erste Zahl
     * @param n zweite Zahl
     * @param precision Genauigkeit mit der berechnet werden soll
     *
     * @return gröster gemeinsamen Teiler zweier Zahlen
     */
    public static final int ggT(int m, int n, int precision) {
        int rest;

        if (m < n) {
            //Werte tauschen, falls falsch herum
            int tmp = m;
            m = n;
            n = tmp;
        }

        //System.out.print("ggt(" + m + ", " + n + ") = ");

        while (n > precision) {
            rest = m % n;

            m = n;
            n = rest;
        }

        //System.out.println(m);

        return m;
    }
}
