# BlueJ,Java, Exponentzechen!



## Azeri (9. Mrz 2008)

Erstmal Hallo.

Es gibt Morsenn'sche Primzahlen: M=2^s+1

Diese Formel funktioniert nicht immer und wir sollen diese Formel untersuchen, und so programieren, dass M nur dann ausgegeben wird, wenn M eine Primzahl ist.  also was ich bis jetzt gemacht hab, aber es funktioniert leider nicht.
Wie ist denn Exponentzeichen für Bluej bzw.Java?



```
public class Informatik
{
int M;
int s;
int S;
    
    public Informatik()
    {
       
    }
    
     
    int Morsenische_Primzahl (int s){
      int zaehler=0;
     for(int i=1; i<=M; i++){
      M=2^s+1;
         if(M%i==0)
            zaehler++;
         if(zaehler==2)
          System.out.println(M);
          
        }
             return zaehler;
}
```
Mit freundlichen Grueßen,
    Edi!


----------



## 0x7F800000 (9. Mrz 2008)

Es gibt in Java kein exponentzeichen, wir sind hier nicht in Fortran.

Wenn du was potenzieren willst, dann bietet die klasse Math einige funktionen wie exp(y) log(y) pow(x,y) usw.
Wenn du ein paar größere Primzahlen finden willst, könntest du BigInteger klasse einsetzen, dort gibt es wohl auch die nötige funktion zum potenzieren. Oder wenigstens mal long statt integer nehmen.

Anwendung der Math klasse würde ich hier abraten, imho sind all diese funktionen für double implemetiert => man kriegt bei integern immer minimale abweichungen. Außerdem ist long dann "hochauflösender" in diesem fall.

Am einfachsten ist es die funktion zum potenzieren einfach mal selbst zu schreiben (für den anfang würde evtl eine funktion reichen die einfach n mal die zahl mit sich selbst multipliziert, eigentlich sollte man die potenz als partition von 2er potenzen darstellen, und sich dann auf wenige quadrat-berechnungen beschränken)

Hier in dem Fall (da die basis ja gerade 2 ist) würde sogar der binäre schift operator reichen:

```
1<<5+1; //ergibt pow(2,5)+1
```

das was du versuchst ist unsinn, ^ ist nämlich der binäre XOR operator, der macht was ganz anderes


Allgemeine anmerkungen zu deinem programm da:
1) entweder ist es so merkwürdig eingerückt, dass ich nicht erkennen kann wo da was anfängt, oder es ist einfach nicht kompilierbar, da sind irgendwo paar klammer verloren gegangen, oder? (wesentlich mehr als ein paar...)

2) wozu ein konstruktor? den brauchst du nicht, der nützt dir nix, der tut nix... mach die methode einfach static.
(mach lieber blueJ erstmal zu und nimm nen stinknormalen texteditor... OOP ist hier eh nicht mal am horizont zu sehen, verwirrt dich nur)

3) wenn diese 2 if-abfragen einen primzahltest symbolisieren sollen, dann muss ich sagen, dass dieser test mir äußerst suspekt vorkommt...  :autsch: 

4) was sind das für member variablen? die sollten sonst wo deklariert werden, zB in der methode selbst. Und die sollten vor allem auch _initialisiert_ werden, bevor du dir irgendwo verwendest. Und die sollten vor allem _verwendet_ werden, wozu zum beispiel ist "S" da? :bahnhof:

5) "s" als member variable und "s" als funktionsparameter... sieht redundant aus...

6) kann das sein dass dieser code einfach nur ein riesiger syntaxfehler ist? kA wie das BlueJ behandelt, Eclipse würde dir da wohl ein paar tipps geben, wo da was nicht passt: indem es den gesamten code rot anstreicht  :bae:


----------



## Azeri (10. Mrz 2008)

```
public class Informatik
{
double M;
double F;
int s;
double x;
int S;
int L;
int E;
int A;
double y;
    
    public Informatik()
    {
       
    }
    
     
    int Morsenesche_Primzahl (int s){
        int zaehler=0;
        y = Math.pow( 2, s );
         M=y+1;
         for(int i=1; i<=M; i++){
             if(M%i==0)
             if(zaehler==2)
             System.out.println(M);
              zaehler++;
            }
           return zaehler;
           
    }
    }
[code]
Hier gibt es keinen Syntaxfehler, aber das Funktioniert ganz. alles ist in ordnung aber System.out.println(M); wird nicht ausgegeben. Wo ist der fähler. Und was da oden ist  double A etc. hat damit nichts zutun, habnur weier was programiert.
```


----------



## Azeri (10. Mrz 2008)

Nicht ganz.=)


----------



## SlaterB (10. Mrz 2008)

programmiere NIE NIE in deinem Leben eine if Abfrage ohne Klammern: { }
setze diese für alle if einzeln korrekt und dein Programm wird etwas korrekter


----------



## 0x7F800000 (10. Mrz 2008)

wie gesagt: Math.pow() ist für double gedacht, nach einem einzigen potenzieren kriegst du niemals mehr eine ganze zahl raus... wenn du schon sowas fehlerbehaftetes machst, solltest du das wenigstens mal runden, oder eine abfrage mit einem kleinen epsilon statt "==" einbauen... Verwende hier echt den shift operator << auf long, da bleibt zumindest alles ganzzahlig.

was solche sachen angeht:

```
if(M%i==0) 
if(zaehler==2) 
System.out.println(M);
```
da muss ich zugeben dass ich nicht einmal theoretisch weiß, wie der compiler das interpretiert...  :shock:  :shock:  :bahnhof:

dein "primzahlentest" ist nach wie vor vollkommen unsinnig.
tipp: schreib dir doch zuerst mal auf einem zettel was du tun willst

und der Mathematiker hieß übrigens Mersenne... Der Erfinder von Morsecode hat damit nichts zu tun... :roll:


----------



## Azeri (10. Mrz 2008)

was ich machen muss, sage ich jetzt mal. Es gibt diese Formel: M=2^s+1 !!!   ABER diese Formel funktioniert nicht ganz!! Also ich schreibe mal unten!!!


```
public class Informatik 
{ 
double M; 
double F; 
int s; 
double x; 
int S; 
int L; 
int E; 
int A; 
double y; 

public Informatik() 
{ 

} 


int Morsenesche_Primzahl (int s){ 
int zaehler=0; 
y = Math.pow( 2, s ); 
M=y+1;                           Bis hierhin will ich, dass man diese Formel benutzen kann!
for(int i=1; i<=M; i++){ 
if(M%i==0) 
if(zaehler==2)                  Und bis dieser Zeile soll es überprüft werden, ob diese Zahl M echt eine Primzahl ist, und 
System.out.println(M);          wenn ja, dann soll die Zahl M ausgegeben!!! weil wenn zaehler==2 ist, dann ist das eine
zaehler++;                         Primzahl!!!!!!
} 
return zaehler; 

} 
}
```


----------



## Azeri (10. Mrz 2008)

Der Erfinder von Morsecode hat damit nichts zu tun...    Morsecode??? häää? hab ich sowas gesagt??? ich glaube nicht!


----------



## Azeri (10. Mrz 2008)

SlaterB hat gesagt.:
			
		

> programmiere NIE NIE in deinem Leben eine if Abfrage ohne Klammern: { }
> setze diese für alle if einzeln korrekt und dein Programm wird etwas korrekter



Danke sehr.!


----------



## quippy (11. Mrz 2008)

Andrey hat gesagt.:
			
		

> was solche sachen angeht:
> 
> ```
> if(M%i==0)
> ...



Formatier das mal vernünftig, dann ergibt sich der Sinn:

```
if(M%i==0) 
   if(zaehler==2) 
      System.out.println(M);
```

oder mit Klammern:
A

```
if(M%i==0) 
{
   if(zaehler==2)
   {
      System.out.println(M);
   }
}
```

also wird da das gleiche draus wie
B

```
if(M%i==0 && zaehler==2)
{
   System.out.println(M);
}
```

wobei A und B nicht synonym sind!

Vor allem, wenn man "else" verwendet, sind Klammern einfach nur noch hilfreich, damit man sofort sieht, auf welchen If sich das Else bezieht!
Der folgende Code liefert nicht das durch die Einrückung suggerierte Ergebnis:

```
if(M%i==0) 
   if(zaehler==2) 
      System.out.println(M); 
else
   system.out.println("m%i ist ungleich null");
```

denn der else bezieht sich auf das zweite if


----------



## Azeri (11. Mrz 2008)

Ja, ich habs grad versucht.Es klappt immer noch nicht. Ich habe keine Ahnung warum.=)
Musseigentlich bis moin fertig haben, aber... 
Bitte weiter helfen!!!
DANKE!


----------



## quippy (12. Mrz 2008)

```
private static void berechneMersenneschePrimzahl(int startPrimzahl)
	{
		double mersenneschePrimzahl = Math.pow(2, startPrimzahl) - 1.0;
		
		// Check, ob wirklich eine Primzahl:
		int ende = ((int)Math.floor(mersenneschePrimzahl / 2.0)) + 1;
		boolean istPrimzahl = true;
		for (int i=2; i<=ende && istPrimzahl; i++)
		{
			if (mersenneschePrimzahl % i == 0) istPrimzahl = false;
		}

		if (istPrimzahl) 
			System.out.println("Die Primzahl " + startPrimzahl + " erzeugt eine Mersennesche Primzahl " + mersenneschePrimzahl);
		else
			System.out.println("Die Primzahl " + startPrimzahl + " erzeugt *KEINE* Mersennesche Primzahl " + mersenneschePrimzahl);
	}
	public static void main(String[] args)
	{
		try
		{
			berechneMersenneschePrimzahl(5);
			berechneMersenneschePrimzahl(11);
		}
		catch (Exception ex)
		{
			ex.printStackTrace(System.err);
		}
	}
```

Deine Formel ist falsch und der Algorithmus auch. Die Mersennesche Primzahl berechnet sich mit M = 2^p *-* 1

Vielleicht willst Du das, was da oben steht - die Speed-Optimierung mit "long" ist hier drunter:

```
private static void berechneMersenneschePrimzahl(int startPrimzahl)
	{
		long mersenneschePrimzahl = (1<<startPrimzahl) - 1;
		
		// Check, ob wirklich eine Primzahl:
		long ende = mersenneschePrimzahl>>1;
		boolean istPrimzahl = true;
		for (int i=2; i<=ende && istPrimzahl; i++)
		{
			if (mersenneschePrimzahl % i == 0) istPrimzahl = false;
		}

		if (istPrimzahl) 
			System.out.println("Die Primzahl " + startPrimzahl + " erzeugt eine Mersennesche Primzahl " + mersenneschePrimzahl);
		else
			System.out.println("Die Primzahl " + startPrimzahl + " erzeugt *KEINE* Mersennesche Primzahl " + mersenneschePrimzahl);
	}
```


----------



## Azeri (12. Mrz 2008)

Guippy, danke sehr, hat mir echt sehr geholfen. Vielen Dank!!!!
lg.Edi


----------

