Prüfen ob Zahl quadratfrei ?

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich suche einen schnelleren Algorithmus als den hier, um zu prüfen ob eine Zahl quadratfrei ist:
Code:
	public static boolean isSquareFree(double testSubject){
		double answer;
		for(int i = 1; i < testSubject; i++){
			answer = Math.sqrt(testSubject / (double)i);
			if(answer < 1){
				return false;
			}
			if(answer % 1.0 == 0){
				return false;
			}
		}
		return true;
	}

Kann mir da jemand weiterhelfen?
 
S

SlaterB

Gast
ständig Wurzel zu berechnen ist schlecht,
aber (zunächst) einmal Wurzel berechnen ist schon sinnvoll:
du musst nämlich maximal alle Zahlen bis zur Wurzel von testSubject testen,

ist testSubject beispielweise 6500, dann musst du nicht 6500 verschiedene Teiler testen sondern nur 81,
da 81 * 81 > 6500 ist, sind höhere Zahlen uninteressant

überhaupt bieten sich viele Verfahren aus Primzahltests und Primfaktorzerlegung an,
suche danach bei google oder gleich hier:
http://de.wikipedia.org/wiki/Sieb_des_Eratosthenes

Vorgehensweise: Primfaktoren finden, aus der Zahl entfernen so oft sie vorkommen,
wenn eine Primzahl doppelt drin, dann schon fertig, ansonsten mit der kleineren Zahl weitermachen

Beispiel: 9295
testen ob teilbar durch 2, durch 3, durch 4 (evtl. alle geraden Teiler auslassen da schon durch 2 getestet)
durch 5 -> einmal drin, Rest 1859, weitermachen,
durch 6 (evtl. alle Vielfachen von 3 auch weglassen da schon durch 3 geprüft, das ist das Sieb von Eratosthenes)
durch 7,
durch 11, -> 11 ist Teiler aber auch nur einmal, Rest 169
durch 13 -> 2x Teiler, keine Quadratzahl


wenn man die Zahl verkleinert, kann man evtl. auch die Obergrenze neu festlegen, die Wurzel von 9295 war 96,
also würde man initial alle Zahlen von 1 bis 96 testen,
die Wurzel von 169 ist aber nur noch 13, also auch wenn es nicht zufällig gerade ein Teiler wäre,
hätte man nun recht bald nach der 13 aufhören können statt noch bis 96 durchzutesten
 
F

Frankyboy

Gast
Eine Zahl n ist quadratfrei, wenn der zugeh. Restklassenring reduziert ist, also kein nilpotentes Element besitzt

http://de.wikipedia.org/wiki/Quadratfrei

Code:
public class Util {
	public static boolean istQuadratfrei(int basis){
		int i = 0;
		do {
			i++;
		}while (!istnilpotent(i, basis)); 
		return (i == basis);
	}
	public static boolean istnilpotent(int n, int basis) {
		int produkt = n;
		ArrayList<Integer> produkte = new ArrayList<Integer>();
		do {
			produkte.add(produkt);
			produkt = (produkt*n)%basis;
		}while(!produkte.contains(produkt));
		return (produkt == 0);
	}
	public static void main (String[] args) {
		for (int i=1; i<100; i++)
		System.out.println(i+" "+istQuadratfrei(i));
	}
}
 

0x7F800000

Top Contributor
Frankyboy hat gesagt.:
Eine Zahl n ist quadratfrei, wenn der zugeh. Restklassenring reduziert ist, also kein nilpotentes Element besitzt
Naja, die Aussage kann man wohl nur als Garantie in die andere Richtung nehmen, aber nicht als Kriterium für Quadratefreiheit :roll:
der Aufwand von der von dir vorgeschlagenen Methode ist extrem gigantisch, ich würde fast behaupten, dass man da mit bruteforce-faktorisierung besser dran wäre ???:L
 
S

SlaterB

Gast
die Aussage im Wiki ist etwas anders
"Eine Zahl n ist genau dann quadratfrei, wenn der Restklassenring reduziert ist, das heißt wenn außer der Null kein nilpotentes Element enthalten ist."
könnte also schon passen, wenn ich das 'genau dann' richtig erinnere
 

visualG

Mitglied
alle primzahlen >3 haben die eigenschaft p = 6n +- 1. Das reduziert schonmal die zu testen zahlen. Du kannst mit ner schleife n hochzählen, die zahl quadrieren und gucken ob sie bei der Division rest 0 lässt. wenn ja, dann hast du ne quadratzahl, wenn nein weitermachen bis 6n+-1 größer als X ist

Code:
public boolean quadratfrei(int zahl)
{
int temp;
if (zahl % 2 == 0 || zahl % 3 == 0) return false;

for(int n = 1; n <= (zahl +1) / 6; n++)
{
temp = (6*n+1);
temp *= temp;
if (zahl % temp == 0) return false;
if (zahl % temp -24*n == 0) return false;
}
return true;

Kann man auch für Primzahlen größer 3 machen, zB n*30+-1,7,11,13

EDIT: Hab code nochmal bischen korrigiert. Also für Integer.MAX_VALUE braucht mein programm 3sec. reicht das an performance?
 

Ark

Top Contributor
Lookup-Tables oder Bäume mit quadratfreien Zahlen könnten ebenfalls zur Geschwindigkeitssteigerung betragen - auf Kosten von Speicher, versteht sich. Dazu wäre jetzt interessant, aus welchem Intervall die zu untersuchenden Zahlen überhaupt kommen; als Kompromiss reicht es vielleicht sogar, nur sehr häufig auftretende Kandidaten aufzunehmen.

Ark
 

visualG

Mitglied
Ich frag mich warum ihr alle so extrem auf zeit optimieren wollt. eine 32bit zahl hat als größten quadratteiler eine 16bit zahl und Alle 6n+-1 zahlen bis 0xFFFF zu testen ist rechenaufwand, was max. 1 sec dauert, wohl gemerkt wenn die Zahl 32bit hat. Meistens sind es ja 10-20 bit weniger. Wozu hat mat GHZ CPUs (10^9. Opperationen/s , 2^16 ~ 10^4,8 zum vergleich )
 

0x7F800000

Top Contributor
visualG hat gesagt.:
eine 32bit zahl...
...ist ein gewöhnlicher Integer, und damit für jegliche zahlentheoretische Untersuchungen/Anwendungen völlig uninteressant/unbrauchbar. Da spielt man schon wesentlich lieber mit paar-hundert-stelligen Zahlen herum, das kann kein Mensch und kein Tier und kein Superrechner per Bruteforce mit Probedivision durchprobieren.
 
G

Guest

Gast
visualG hat gesagt.:
alle primzahlen >3 haben die eigenschaft p = 6n +- 1. Das reduziert schonmal die zu testen zahlen. Du kannst mit ner schleife n hochzählen, die zahl quadrieren und gucken ob sie bei der Division rest 0 lässt. wenn ja, dann hast du ne quadratzahl, wenn nein weitermachen bis 6n+-1 größer als X ist

Code:
public boolean quadratfrei(int zahl)
{
int temp;
if (zahl % 2 == 0 || zahl % 3 == 0) return false;

for(int n = 1; n <= (zahl +1) / 6; n++)
{
temp = (6*n+1);
temp *= temp;
if (zahl % temp == 0) return false;
if (zahl % temp -24*n == 0) return false;
}
return true;

Kann man auch für Primzahlen größer 3 machen, zB n*30+-1,7,11,13

EDIT: Hab code nochmal bischen korrigiert. Also für Integer.MAX_VALUE braucht mein programm 3sec. reicht das an performance?

Leider ist der Code nicht korrekt.
Denn 6 ist beispielsweise quadratfrei, wird aber von obiger Methode als nicht quadratfrei angegeben.
 

visualG

Mitglied
Ja, stimmt. Ich muss ja auch auf 4 und 9 testen und nich tauf 2 und 3. Außerdem reicht es bis zur Wurzel aus n zu rechnen
Code:
public boolean quadratfrei(int zahl)
{
int temp;
if (zahl % 4 == 0 || zahl % 9 == 0) return false;

for(int n = 1; n <= (int) (Math.Sqrt(zahl) +1) / 6; n++)
{
temp = (6*n+1);
temp *= temp;
if (zahl % temp == 0) return false;
if (zahl % temp -24*n == 0) return false;
}
return true;
 
S

SlaterB

Gast
bitte bitte nicht optimieren, indem nur bis zur wurzel von zahl geprüft wird und dann diese Wurzel in der for-Schleife in jeder Runde neu ausrechnen(!)

egal ob der Compiler das vielleicht wegoptimiert,
vorher in eine Variable schreiben und die Sache ist erledigt
 

0x7F800000

Top Contributor
am besten gar keine wurzel ziehen, sondern durch >> etwas gröber als durch wurzel abschätzen, diese wurzelzieherei kostet mehr als die paar zahlen zuviel, die man sonst prüft... könnte zumindest so sein...
 
G

Gast

Gast
Was meinst du mit >> die wurzel abschätzen?
Du meinst doch Bitverschiebung oder? Wie kann man damit die ungefähre Wurzel abschätzen?
 
S

SlaterB

Gast
bei einer Zahl mit 20 Bit kann wohl maximal 2^20 vorliegen, davon die Wurzel ist 2^10

da braucht man gar nicht unbedingt verschieden, wenn man erstmal das höchste Bit bestimmt hat (doch wiederum durch Verschieben?),
kann man auch aus einem Array die passende Wurzel entnehmen

die Bandbreite zwischen 2^9 und 2^10 ist allerdings gleich nochmal 2^9, also mit Pech eine Verdopplung der Arbeit,
ob das mit 'die paar zahlen zuviel' noch einhergeht?,
nur um die Wurzel einmalig nicht auszurechnen?
vielleicht gehts aber noch genauer
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
sserio Prüfen, ob eine Zahl eine periodische Zahl ist Java Basics - Anfänger-Themen 20
K Warum gibt mir z. B. 40^128 eine Zahl? Ich dachte mit xor kann man nur booleanwerte erhalten, also prüfen ob etwas whar oder falsch ist? Java Basics - Anfänger-Themen 1
Q Prüfen ob Zahl als Summe von Potenzen dargestellt werden kann. Java Basics - Anfänger-Themen 20
M Prüfen, ob Zeichen eine Zahl ist Java Basics - Anfänger-Themen 3
C Datentypen Prüfen of eine Zahl Quadratzahl ist Java Basics - Anfänger-Themen 2
N jnumberfield prüfen, ob eine Zahl eigegeben wurde Java Basics - Anfänger-Themen 12
T Prüfen, ob ein String eine Zahl ist Java Basics - Anfänger-Themen 10
D Int Zahl auf Negativität prüfen Java Basics - Anfänger-Themen 2
M Aufgabe: Array auf doppelte Zahl prüfen Java Basics - Anfänger-Themen 8
G Auf Zahl prüfen Java Basics - Anfänger-Themen 2
D Prüfen ob die Zahl nur bestimmte Nachkommastellen hat Java Basics - Anfänger-Themen 3
G Prüfen ob Zahl oder Buchstabe Java Basics - Anfänger-Themen 2
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
Ostkreuz Int Scanner auf Enter Eingabe prüfen Java Basics - Anfänger-Themen 4
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
Fiedelbambu Prüfen von Komma stelle beim Taschenrechner Java Basics - Anfänger-Themen 5
I Auf vollen Monat prüfen? Java Basics - Anfänger-Themen 22
A Dateiname auf Vorkommen prüfen Java Basics - Anfänger-Themen 29
I Prüfen, ob Anzahl an Monate ein Jahr ergeben Java Basics - Anfänger-Themen 4
W Klasse existiert prüfen Java Basics - Anfänger-Themen 5
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
O Ich ahbe einen char und diesen soll ich bei .matches prüfen, also ob der char in meiner Zeichenkette vorhanden ist, wie mache ich das? Java Basics - Anfänger-Themen 9
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
M Array auf Primzahlen prüfen Java Basics - Anfänger-Themen 7
K Wie String prüfen ob drei mal das gleiche Zeichen vorkommt? Java Basics - Anfänger-Themen 7
J ArrayList auf bereits vorhanden eintrag prüfen Java Basics - Anfänger-Themen 5
X Zwei Dimensionales Array prüfen Java Basics - Anfänger-Themen 1
B Prüfen, ob Zeit Überschreitung Java Basics - Anfänger-Themen 2
B Sudoku prüfen Java Basics - Anfänger-Themen 13
M Prüfen auf null ohne NPE Java Basics - Anfänger-Themen 1
X Array auf Leerstellen prüfen Java Basics - Anfänger-Themen 1
FelixN Prüfen, ob ein 2D-Array rechteckig ist Java Basics - Anfänger-Themen 42
C Erste Schritte JComboBox Einträge auf Duplikat prüfen Java Basics - Anfänger-Themen 4
M prüfen ob alle array werte gleich sind Java Basics - Anfänger-Themen 27
C Array auf Null-Inhalte prüfen Java Basics - Anfänger-Themen 9
B Prüfen, ob Country Code in Europa ist? Java Basics - Anfänger-Themen 24
L Prüfen ob Fax (Tif-Datei) vollständig angekommen ist Java Basics - Anfänger-Themen 15
O Datenstruktur auf SET prüfen in O(n) Java Basics - Anfänger-Themen 32
O Einzelne Bits umwandeln und prüfen Java Basics - Anfänger-Themen 23
U Mehrfacheingabe auf bestimmte Parameter prüfen Java Basics - Anfänger-Themen 8
B Prüfen, ob Datum2 der gleiche Tag ist wie Datum1 Java Basics - Anfänger-Themen 10
Dimax Erste Schritte String Eingabe Prüfen Java Basics - Anfänger-Themen 11
S char auf buchstabe/zeichen prüfen Java Basics - Anfänger-Themen 1
S Array doppelter Wert prüfen Java Basics - Anfänger-Themen 7
B Prüfen, ob es schon einen Termin gibt in einem Zeitraum Java Basics - Anfänger-Themen 5
K Linux Speicherplatz mit Java prüfen Java Basics - Anfänger-Themen 4
O Array nach gleichen Zahlen prüfen und ausgeben Java Basics - Anfänger-Themen 6
G Compiler-Fehler Auf Anagramm prüfen Java Basics - Anfänger-Themen 1
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8
DaCrazyJavaExpert Input/Output Prüfen wie oft etwas eingegeben wurde Java Basics - Anfänger-Themen 2
K Operatoren 2D Int Array auf Null-Referenzen prüfen Java Basics - Anfänger-Themen 18
S Prüfen ob Zelle in Excel leer ist funktioniert nicht (Apache POI) Java Basics - Anfänger-Themen 18
C Klassen Reguläre Ausdrücke auf Gleichheit prüfen Java Basics - Anfänger-Themen 5
M Erste Schritte Java prüfen ob eine der Möglichkeiten erfüllt ist Java Basics - Anfänger-Themen 2
R Auf Nachkommastellen prüfen. Java Basics - Anfänger-Themen 2
P Argumente auf plausibilität prüfen... Java Basics - Anfänger-Themen 8
F LimitedQueue auf Datum prüfen Java Basics - Anfänger-Themen 6
B Passwort prüfen bis eindeutig - while Schleife? Java Basics - Anfänger-Themen 11
Tommy Nightmare Variable auf mehrere Ungleichheiten prüfen Java Basics - Anfänger-Themen 18
B String mit Emailadresse prüfen Java Basics - Anfänger-Themen 11
E 2D Arrays auf Ungleichheit prüfen! Java Basics - Anfänger-Themen 5
MrSnake Prüfen ob TitledPane schon besteht Java Basics - Anfänger-Themen 2
B Serial Key prüfen -> String mit privatem Key und dann abgleichen; Summe = 0 Java Basics - Anfänger-Themen 8
N Compiler-Fehler Iban prüfen Java Basics - Anfänger-Themen 7
J Prüfen ob Arrays nur mit einem Wert belegt sind Java Basics - Anfänger-Themen 3
M String prüfen Java Basics - Anfänger-Themen 7
E Prüfen ob Sammlung gesetzt wurde - Lebensmittelsammlung Java Basics - Anfänger-Themen 8
H Zufällig generierte Zahlen auf Eingabe prüfen Java Basics - Anfänger-Themen 5
S Prüfen ob bestimmter Ordner geöffnet ist (Windows XP) Java Basics - Anfänger-Themen 5
Ruvok Prüfen ob bestimmtest Element existiert im Array Java Basics - Anfänger-Themen 11
DeVolt Java8 Paket Time: Datum prüfen / try-catch Java Basics - Anfänger-Themen 1
W char-Array auf bestimmte Zeichen prüfen Java Basics - Anfänger-Themen 10
S String auf Pallindromeigenschaft prüfen Java Basics - Anfänger-Themen 15
AssELAss Datums-Objekt prüfen ob im gleichen Monat? Java Basics - Anfänger-Themen 5
Screen Input/Output Wie prüfen ob Stream1 in Stream2 enthalten ist (on-the-fly) ? Java Basics - Anfänger-Themen 5
P Seite auf Inhalt prüfen Java Basics - Anfänger-Themen 2
I Prüfen ob Webseite existiert Java Basics - Anfänger-Themen 3
Z Inputs prüfen Java Basics - Anfänger-Themen 6
G Textdatei auf Dubletten prüfen Java Basics - Anfänger-Themen 8
I Prüfen von zwei Listen Java Basics - Anfänger-Themen 1
K zwei Rechtecke auf Berührung prüfen Java Basics - Anfänger-Themen 2
G String auf Format prüfen Java Basics - Anfänger-Themen 3
J Eingabewert übergeben und prüfen von showInputDialog Java Basics - Anfänger-Themen 4
L 6stellige Zufallszahlen erzeugen & auf einzigartigkeit prüfen Java Basics - Anfänger-Themen 3
S Array befüllen & auf doppelte werte prüfen Java Basics - Anfänger-Themen 6
M Punkt auf eine Farbe prüfen Java Basics - Anfänger-Themen 8
K Eindimensionalen Array prüfen Java Basics - Anfänger-Themen 5
M Konstruktor auf null prüfen, Arrays Java Basics - Anfänger-Themen 9
O Prüfen ob ein String den selben Namen hat wie eine Booleanreihe? Java Basics - Anfänger-Themen 17
J Arrays prüfen und über if Bedingung ausgeben Java Basics - Anfänger-Themen 15
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
L Erste Schritte Einträge in ArrayList prüfen Java Basics - Anfänger-Themen 4
S OOP long prüfen Java Basics - Anfänger-Themen 5
H Prüfen, ob jpg image schon vorhanden ist, bevor es geladen wird Java Basics - Anfänger-Themen 13
L Eine ArrayList auf gleiche Inhalte prüfen Java Basics - Anfänger-Themen 10
Rayo Eingelesene Ascii Zahlen wie normale Zahlen prüfen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben