BigInteger - newbie problem :(

0

Witajcie
napisalam program w C. Niestety okazuje sie, ze zakres int jest zbyt maly, aby uzyskac interesujace mnie duze liczby, postanowilam wiec wykorzystac magiczny typ BigInteger. Niestety nie moge sobie z tym poradzic. Czy moge liczyc na jakies wskazowki?

kod w C:

#include <stdio.h>
#include <math.h>

main()
{
	long long int S[1000];
	S[1]=4;
	int p=0;           //potega liczby Mersenne'a
	long long int M;   //testowana liczba Mersenne'a
	
	printf ("Znalezione liczby pierwsze Mersenne'a: \n\n");
	
     do{
        p++;
	   M = pow (2,p) - 1;
	   //petla do generowania S
        for (int k=2;k<p;k++)
        {
            long long int mod;     
            mod = S[k-1]%M;      
            S[k] =  (mod*mod) - 2;
            if(S[k]%M==0) 
            {
               printf ("p: %d \n", p);
               printf ("M= %d \n\n", M);
            }
        }    
     }
     while(p<33);
     getchar();
}

Natomiast w Javie stworzylam jak dotad cos takiego:

 
import java.math.*;
import java.io.*;

class PowerClass {
    public BigInteger PowerN (int n) {
        return java.lang.Math.pow(2,n);
    }
}

public class PrimesSearch {

	public static void main(String[] args)
	{
	BigInteger []S = new BigInteger [1000];
	S[1]=4;
	int p=0;
	BigInteger M = BigInteger.ZERO;
	System.out.println("Znalezione liczby pierwsze Mersenne'a");
	
	do{
	p++;
	PowerClass pc = new PowerClass();
	BigInteger mp = pc.PowerN(p);
	//M= mp - 1;
	M=mp.subtract(BigInteger.ONE);
	System.out.println("M= " + M);
	for (int k=2; k<p; k++){
		BigInteger mod = BigInteger.ZERO;;
		mod = S[k-1]%M;
		System.out.println("mod= " + mod);
		S[k]=(mod*mod)-2;	
		
		if (S[k]%M == 0) {
			System.out.println("p= " + p);
			System.out.println("M= " + M);
		}
	}
	}while (p<33);
	}
}

Niestety nie nosi nawet cech dzialania :(

0

a co tzn. że nie działa?

0

Przy próbie uruchomienia pokazują się błędy:

 
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	Type mismatch: cannot convert from int to BigInteger
	The operator % is undefined for the argument type(s) java.math.BigInteger, java.math.BigInteger
	The operator * is undefined for the argument type(s) java.math.BigInteger, java.math.BigInteger
	The operator % is undefined for the argument type(s) java.math.BigInteger, java.math.BigInteger

	at PrimesSearch.main(PrimesSearch.java:15)
0

Typ BigInteger to typ obiektowy, a nie prosty. Dlatego nie można używać przy nim operatorów matematycznych, których używa się dla typów prostych (pomijam tu wrappery typów prostych). Aby program zaczął się kompilować:
mod = S[k-1]%M zamień na mod = S[k-1].mod(M)
S[k]=(mod*mod)-2 zamień na S[k]=(mod.multiply(mod)).substract(2)

Inne miejsca analogicznie. Powinno pójść.

0

Dzieki, poprawilam i obecnie wyglada to tak:

 
import java.math.*;
import java.io.*;

class PowerClass {
    public BigInteger PowerN (int n) {
        return java.lang.Math.pow(2,n);
    }
}

public class PrimesSearch {

	public static void main(String[] args)
	{
	BigInteger []S = new BigInteger [1000];
	S[1]=4;
	int p=0;
	BigInteger M = BigInteger.ZERO;
	System.out.println("Znalezione liczby pierwsze Mersenne'a");
	
	do{
	p++;
	PowerClass pc = new PowerClass();
	BigInteger mp = pc.PowerN(p);
	//M= mp - 1;
	M=mp.subtract(BigInteger.ONE);
	System.out.println("M= " + M);
	for (int k=2; k<p; k++){
		BigInteger mod = BigInteger.ZERO;;
		//mod = S[k-1]%M;
		mod=S[k-1].mod(M);
		System.out.println("mod= " + mod);
		//S[k]=(mod*mod)-2;	
		S[k]=(mod.multiply(mod)).subtract(2);
		
		//if (S[k]%M == 0) {
		if (S[k].mod(M) == 0) {
			System.out.println("p= " + p);
			System.out.println("M= " + M);
		}
	}
	}while (p<33);
	}
}

Nadal mam problem z:

  1. tablicami BigIntegerow

  2. komentarz do linii
    S[k]=(mod.multiply(mod)).subtract(2);
    jest nastepujacy:
    The method subtract(BigInteger) in the type BigInteger is not applicable for the arguments (int)

  3. komentarz do linii:
    if (S[k].mod(M) == 0)
    jest:
    Incompatible operand types BigInteger and int

Probowalam zmienic to na == BigInteger.ZERO, ale tez jest niekomatybilny typ.

  1. chyba najgorsza sprawa... problem z klasa sluzaca do liczenia potegi.
    return java.lang.Math.pow(2,n);
    komentarz:
    Type mismatch: cannot convert from double to BigInteger

:(

0

ad.0: polecam http://download.oracle.com/javase/1.4.2/docs/api/java/math/BigInteger.html
ad.1: a w czym problem?
ad.2, ad.3: te argumenty i wynik są bigintami i więc 2 i 0 też muszą być w postaci bigintowej
ad4. użyj konstruktora biginta: return new BigInteger( coś tam)

0
Smerfetka napisał(a)

Nadal mam problem z:

  1. tablicami BigIntegerow

?

Smerfetka napisał(a)
  1. komentarz do linii
    S[k]=(mod.multiply(mod)).subtract(2);
    jest nastepujacy:
    The method subtract(BigInteger) in the type BigInteger is not applicable for the arguments (int)

S[k]=(mod.multiply(mod)).subtract(new BigInteger(2));

Smerfetka napisał(a)
  1. komentarz do linii:
    if (S[k].mod(M) == 0)
    jest:
    Incompatible operand types BigInteger and int

Probowalam zmienic to na == BigInteger.ZERO, ale tez jest niekomatybilny typ.

if (S[k].mod(M).equals(BigInteger.ZERO))

Smerfetka napisał(a)
  1. chyba najgorsza sprawa... problem z klasa sluzaca do liczenia potegi.
    return java.lang.Math.pow(2,n);
    komentarz:
    Type mismatch: cannot convert from double to BigInteger

Po co Ci w ogóle ta klasa? BigInteger zawiera metodę pow:
http://download.oracle.com/javase/1.4.2/docs/api/java/math/BigInteger.html#pow%28int%29

0

Jak operujesz na typie Biginteger zapomnij w ogóle o "normalnych" operacjach. Wszystkie dane potrzebne Ci do obliczeń zamieniasz na ten własnie typ (nawet 0 i 1 są stałymi zdefiniowanymi w tej klasie i to ich masz używać)....a operatory stosujesz bezpośrednio z klasy BigInteger (są chyba wszystkie). W ogóle pierw to przejrzyj co ta klasa Ci umiożliwia....

0

Troche posprzatalam, oto efekt:

 
import java.math.*;
import java.io.*;

public class PrimesSearch {

	public static void main(String[] args)
	{
	BigInteger []S = new BigInteger [1000];
	S[1]=4;
	int p=0;
	BigInteger M = BigInteger.ZERO;
	System.out.println("Znalezione liczby pierwsze Mersenne'a");
	
	do{
	p++;

	BigInteger mp = 2;
	mp.pow(p);

	M=mp.subtract(BigInteger.ONE);
	System.out.println("M= " + M);
	for (int k=2; k<p; k++){
		BigInteger mod = BigInteger.ZERO;;
		mod=S[k-1].mod(M);
		System.out.println("mod= " + mod);
		S[k]=(mod.multiply(mod)).subtract(new BigInteger(2));
		
		if (S[k].mod(M).equals(BigInteger.ZERO)) {
			System.out.println("p= " + p);
			System.out.println("M= " + M);
		}
	}
	}while (p<33);
	}
}

Problemy:

  1. problem z tablica to ogolnie problem z przypisywaniem wartosci int do BigIntegera, a konkretnie w linijkach
 S[1]=4;
 BigInteger mp = 2;

Mam info:
Type mismatch: cannot convert from int to BigInteger

  1. natomiast tutaj
 S[k]=(mod.multiply(mod)).subtract(new BigInteger(2));

mam:
The constructor BigInteger(long) is not visible

Dziekuje wszystkim, ktorzy juz mi pomogli :) Mysle, ze niewiele brakuje, zeby to ozywic.

0

@lipkerson napisał

W ogóle pierw to przejrzyj co ta klasa Ci umiożliwia....

Zastosowałaś się do tej rady?

  ...=new BigInteger("2");

Reszty poszukaj sama w dokumentacji.

0
bo napisał(a)

@lipkerson napisał

W ogóle pierw to przejrzyj co ta klasa Ci umiożliwia....

Zastosowałaś się do tej rady?

Tak.

bo napisał(a)
  ...=new BigInteger("2");

Reszty poszukaj sama w dokumentacji.

Jak nie chcesz, to nie musisz pisac :)

0

Już mi wszystko działa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1