Napisałem funkcje, która:
a) dla danej liczby postaci (sqrt(a) tzn. pierwiastek z a) znajdzie okres rozwinięcia na ułamek łańcuchowy
b) Wykorzystuje ten algorytm do znalezienia rozwinięcia liczby sqrt(4729494) na ułamek łańcuchowy
private int getPeriod(int x)
{
System.out.print("[");
// bez żadnej części ułamkowej
int root = (int) Math.sqrt(x);
// wyklucz doskonałe kwadraty (bez okresu)
if (root * root == x)
{
return 0;
}
// część całkowita sqrt (x) - a0
int a = root;
System.out.print(a);
// użyjmy zmiennej licznika, aby zapisać to, co odejmujemy
int numerator = 0;
int denominator = 1;
// policz, jak długo to trwa, zanim rozpocznie się kolejny okres
int period = 0;
System.out.print("; ");
//zakońć, gdy po raz drugi zobaczymy ten sam tryplet (a, licznik, mianownik)
// to dzieje się dokładnie wtedy, gdy == 2 * root
while (a != 2 * root)
{
//a1
numerator = denominator * a - numerator;
// must be integer divisions !
//muszą to być dzielenia integer-owe
denominator = (x - numerator * numerator) / denominator;
a = (root + numerator) / denominator;
System.out.print(a);
if (a != 2 * root)
{
System.out.print(", ");
}
period++;
}
System.out.print("], ");
return period;
}
Moje pytanie jest czy taka zamiana jak poniżej jest wystarczająca aby w pełni wykorzystać funkcje pod kątem typu BigInteger czy też musze zamienić argument funkcji long x na zmienną typu BigInteger x aby mieć w pełni zmienioną funkcje z pierwszej na drugą. Głównie chodzi mi o zakres. Wiećpoprosiłbym o pomoc przy tym jeśli coś nie tak zrobiłem ponieważ dopiero zaczełem stosowac tą klasę BigInteger z biblioteki java.math.BigInteger.
static BigInteger period_1, denominator_1,numerator_1, root_1, x_1;
private BigInteger getPeriod(long x)
{
System.out.print("[");
// bez żadnej części ułamkowej
root_1 = BigInteger.valueOf((long)Math.sqrt(x));
// wyklucz doskonałe kwadraty (bez okresu)
x_1=BigInteger.valueOf(x);
if (root_1.multiply(root_1) == x_1)
{
return BigInteger.ZERO;
}
// część całkowita sqrt (x) - a0
BigInteger a = root_1;
System.out.print(a);
// użyjmy zmiennej licznika, aby zapisać to, co odejmujemy
numerator_1 = BigInteger.ZERO; // initially zero, e.g. 4 will appear in second iteration of sqrt(23)
denominator_1 = BigInteger.ONE; // initially one, e.g. 7 will appear in second iteration of sqrt(23)
// policz, jak długo to trwa, zanim rozpocznie się kolejny okres
period_1 = BigInteger.ZERO;
System.out.print("; ");
BigInteger two = BigInteger.valueOf(2);
//zakońć, gdy po raz drugi zobaczymy ten sam tryplet (a, licznik, mianownik)
// that this happens exactly when a == 2 * root
while (!a.equals(two.multiply(root_1)))
{
//a1
numerator_1 = denominator_1.multiply(a).subtract(numerator_1);
// must be integer divisions !
denominator_1 = (x_1.subtract(numerator_1.multiply(numerator_1))).divide(denominator_1);
a = (root.add(numerator_1)).divide(denominator_1);
System.out.print(a);
if (!a.equals(two.multiply(root_1)))
{
System.out.print(", ");
}
period_1 = period_1.add(BigInteger.ONE);
}
System.out.print("], ");
return period_1;
}