kann mir jemand folgendes Programm von Java in C++ übersetzten?



  • ich brauche unbedingt jemanden der mir folgendes in c++ übersetzten kann:

    mport java.awt.;
    import java.applet.
    ;
    import java.math.BigInteger;
    import java.util.Random;

    public class Miller_Rabin_basic extends Applet {

    int w; // Zeugen

    public void init() {
    // Eingabe: eine natürliche ungerade Zahl größer 2
    BigInteger N = new BigInteger("4503599627370449");
    w = 10;
    miller_rabin(N,w);
    }

    // Häufig benötigte Werte
    BigInteger Big0 = BigInteger.valueOf(0);
    BigInteger Big1 = BigInteger.valueOf(1);
    BigInteger Big2 = BigInteger.valueOf(2);

    public void miller_rabin(BigInteger N, int s) {
    BigInteger R, N_2 = N.subtract(Big2);
    boolean prime = true;
    for (w=1;w<s+1;w++) {
    R = random(N_2);
    if (witness(R,N)) {
    prime = false;
    break;
    }
    }
    if (prime) System.out.println(N.toString()+" ist eine Primzahl !");
    else System.out.println(N.toString()+" ist keine Primzahl !");
    }

    Random seed = new Random();

    public BigInteger random(BigInteger N_2) {
    BigInteger R;
    // Zufallszahl aus [1,N-1]
    do {R = new BigInteger(N_2.bitLength(),seed).add(Big1);}
    while (R.compareTo(N_2)>0);
    return R;
    }

    String bin;

    public String bigIntToBinaryString(BigInteger 😎 {
    // Eingabe in binäre Form umwandeln
    for (BigInteger I=Big2.pow(B.bitLength()-1);I.compareTo(Big0)!=0;I=I.divide(Big2)) {
    if (B.compareTo(I)>=0) {
    bin += "1";
    B = B.subtract(I);
    }
    else
    bin += "0";
    }
    return bin;
    }

    public BigInteger modular_exponentiation(BigInteger A, BigInteger U, BigInteger N) {
    BigInteger C = Big0;
    BigInteger D = Big1;
    // Sei {b[0],b[1],...,b[k-1],b[k]} die binäre Darstellung von b
    if (w==1)
    bin = bigIntToBinaryString(U);
    // Da für alle Zeugen gleich, nur einmal berechnen
    for (int i=0;i<bin.length();i++) {
    C = C.multiply(Big2);
    D = D.pow(2).mod(N);
    if (bin.charAt(i)=='1') {
    C = C.add(Big1);
    D = D.multiply(A).mod(N);
    }
    }
    return D;
    }

    int t;

    public boolean witness(BigInteger A, BigInteger N) {
    BigInteger N_1 = N.subtract(Big1);
    // Sei n-1 = 2^t*u mit t >= 1 und u ungerade
    if (w==1)
    while(N_1.divide(Big2.pow(t)).mod(Bi2).compareTo(Big0)==0)
    t++;
    // Da für alle Zeugen gleich, nur einmal berechnen
    BigInteger U = N_1.divide(Big2.pow(t));
    BigInteger x0;
    BigInteger x1 = modular_exponentiation(A,U,N); // A^U mod N
    // Schneller ist x1 = A.modPow(U,N);
    for (int i=1;i<t+1;i++) {
    x0 = x1;
    x1 = x0.pow(2).mod(N);
    if (x1.compareTo(Big1)==0 && x0.compareTo(Big1)!=0 && x0.compareTo(N_1)!=0)
    return true;
    }
    if (x1.compareTo(Big1)!=0)
    return true;
    else
    return false;
    }
    }



  • Welche Zielplattform und was zahlst Du? 😉


  • Mod

    uhhh... und kann mir einer das Javaprogramm da nach c++ übersetzen?

    import java.util.*;
    
    public class ThreadTest
    {
       public static void main(String[] args)
       {
          testMethod();
          one();
          two();
       }
    
       public static void one()
       {
          testMethod();
       }
    
       public static void two()
       {
          testMethod();
       }
    
       public static void testMethod()
       {
          StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
          if(stackTrace[3].getLineNumber() > 15)
          {
             System.out.println("Mich darf man nur bis Zeile 15 aufrufen, du Arsch!");
             return;
          }
          System.out.println("Ich wurde von " + stackTrace[3].getMethodName() + 
                             " in der Klasse " + stackTrace[3].getClassName() + 
                             " in Zeile Nummer " + stackTrace[3].getLineNumber() + " aufgerufen.");
       }
    }
    

    🙂 ...die Zielplattform ist mir egal und ich zahle nix.



  • Gilt auch C++/CLI? 😃 :p



  • ja c++/cli gilt auch, zielplatform ist mir egal und ich wollte eigentlich nix zahlen.



  • Wenn der Code mit Java-Codetags versehen wäre, hätte ich ihn mir angeschaut. 🙄
    @Gregor:

    namespace
    {
    
        void testMethod()
        {
            using namespace System;
            using namespace System::Diagnostics;
            using namespace System::Threading;
            StackTrace stackTrace(true);
            if (stackTrace.GetFrame(2)->GetFileLineNumber() > 15)
            {
                Console::WriteLine(L"Mich darf man nur bis Zeile 15 aufrufen, du *****!");
                return;
            }
            Console::WriteLine("Ich wurde von {0} in der Klasse {1} in Zeile Nummer {2} aufgerufen",
                               stackTrace.GetFrame(2)->GetMethod()->Name,
                               stackTrace.GetFrame(2)->GetMethod()->DeclaringType ? 
                                   stackTrace.GetFrame(2)->GetMethod()->DeclaringType->Name :
                                   L"<keine Klasse>",
                               stackTrace.GetFrame(2)->GetFileLineNumber());
        }
    
        void one()
        {
            testMethod();
        }
    
        void two()
        {
            testMethod();
        }
    
    }
    
    int main()
    {
        testMethod();
        return 0;
    }
    


  • x_dawnbeach schrieb:

    ich brauche unbedingt jemanden der mir folgendes in c++ übersetzten kann:

    Warum?



  • ich brauch den zuerst genannten java code in c++, da für meine primzahlrechnung die java platform zu langsam ist. mit c++ verspreche ich mir einen gewschwindigkeitsvorteil. (wer sich genauer interresiert, das ist der miller-rabin prime-test)


  • Mod

    x_dawnbeach schrieb:

    ich brauch den zuerst genannten java code in c++, da für meine primzahlrechnung die java platform zu langsam ist. mit c++ verspreche ich mir einen gewschwindigkeitsvorteil. (wer sich genauer interresiert, das ist der miller-rabin prime-test)

    1. Wenn Du das Optimum an Performance herausholen willst, musst Du sowieso selbst ran. Das macht keiner für dich, es sei denn, Du zahlst ordentlich. Es ist auch nicht so, dass man automatisch mehr Performance kriegt, wenn man ein Programmstück völlig ohne jede Veränderung von Java nach C++ übersetzt. Unter C++ kann man bestimmte Dinge machen, die man unter Java nicht machen kann: Einige dieser Dinge können (richtig eingesetzt) Performance bringen. Andere Dinge können in beiden Sprachen gemacht werden, haben aber jeweils unterschiedliche Performance- und Speichercharakteristiken. Das ist dann aber auch nicht immer zum Vorteil von C++. Du kriegst die Performance also nicht einfach so, nur weil Du C++ einsetzt. Und entsprechend solltest Du genau wissen, warum und wie Du C++ hier einsetzen möchtest, um gegenüber dem Javaprogramm Performance herauszuholen.

    ...das weißt Du aber nicht, denn sonst könntest Du den Code locker selbst schreiben. Weißt Du überhaupt, ob der Javacode hier langsam ist? Wenn ja: Weißt Du, ob das speziell an Java liegt bzw. welche Gründe das genau hat?

    2. Die Standardbibliothek von C++ kennt keinen Datentyp für große Ganzzahlen. Vielleicht solltest Du also genauer sagen, was Du auf C++-Seite als Äquivalent zu BigInteger nehmen möchtest.

    @Gideon: Interessant! 🙂



  • der java code ist nicht langsam, aber erkönnte schneller sein. ich könnte das programm auch selber in c+ übersetzen, doch ich weiß nicht wie ich einen großen zahlentyp deklariere(>=10.000.001 stellen) und wie ich mod, div, tobinarystring und 2^ mit funktionen schnell berechnen kann (durch welche bibliotheken oder so). weis jemand ne antwort?



  • Die Datentypen mit dem größten Wertebereich sind __int64 und long long, aber 10 mio liegt im Wertebereich von int!!!

    div: / (division)
    mod: % (modulo)
    potenzieren: pow()

    int zu string: itoa()

    Nun müsstest du problemlos den Code zu C++ übersetzen können :p



  • nicht die zahl 10 mio, sonder 10 mio stellen: z.B. 8765 hat vier stellen. int hat nur 10 stellen oder so, int64 hat die meisten mit 20, ich brauche aber 10mio., dass ist mein problem.


  • Mod

    x_dawnbeach schrieb:

    ich könnte das programm auch selber in c+ übersetzen, doch ich weiß nicht wie ich einen großen zahlentyp deklariere(>=10.000.001 stellen) und wie ich mod, div, tobinarystring und 2^ mit funktionen schnell berechnen kann (durch welche bibliotheken oder so). weis jemand ne antwort?

    Frag mal im C++ Forum nach ner Bibliothek für große Zahlen. Da gibt es sicherlich etwas. ...und ich glaube sogar, dass danach relativ häufig gefragt wird. Es sollte sich also lohnen, vorher mal in die FAQ zu gucken.



  • Was macht man mit einer Zahl, die 10mio Stellen hat? 😕



  • (a) aufessen
    (b) damit rechnen



  • (a) 👍 😋



  • http://de.wikipedia.org/wiki/Primzahlen#Gr.C3.B6.C3.9Fte_bekannte_Primzahl schrieb:

    Der Satz von Euklid besagt, dass es keine größte Primzahl gibt. Es ist jedoch kein Verfahren bekannt, das effizient beliebig große Primzahlen generiert, so dass es stets eine größte bekannte Primzahl gab, seitdem sich die Menschen mit Primzahlen befassen. Derzeit ist es 230.402.457 − 1, eine Zahl mit 9.152.052 (dezimalen) Stellen, gefunden am 15. Dezember 2005 von einem Professorenteam der Central Missouri State University im Rahmen des George Woltmans GIMPS-Projekts (Great Internet Mersenne Prime Search) zur Suche von Mersenne-Primzahlen. Für den ersten Primzahlbeweis einer Zahl mit mehr als 10 Millionen Dezimalstellen hat die Electronic Frontier Foundation einen Preis von 100.000 US-Dollar ausgeschrieben.

    Du willst wohl nicht etwa versuchen ein paar Euros nebenbei zu verdienen? Die Sache mit der Zahl mit den 10 Mio Stellen hört sich verdammt danach an ...


Anmelden zum Antworten