Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.
Καλησπέρα παιδιά , έχω δημιουργήσει ένα πρόγραμμα ώστε να υπολογίζει τον εκθέτη (x) μέσα σε ένα εύρος επαναλήψεων.
Σαν παράμετρο βάζω :
g=257
h=369
p=1009( που αντιστοιχεί στο modulo)
ωστόσο αντι για να μου δώσει σαν αποτέλεσμα x=104 που είναι η σωστή απάντηση μου δίνει συνεχώς 112 ανεξαρτήτως από τι τιμή θα δώσω στο modulo. δηλαδή είτε δώσω 1009 σαν τιμή είτε 21312 θα μου δώσει σαν αποτέλεσμα χ=112...για ποιο λόγο ?τι κάνω λάθος? παρακάτω είναι ο κώδικας.
Ευχαριστώ εκ των προτέρων :)
 
import java.util.Scanner;
public class Crypt {
 
 private static int g;
 private static int h;
 private static  int p ;
 
 public static void main(String[] args) {
  
  Scanner in = new Scanner(System.in);
  
  
  
  System.out.println("Δώστε αριθμό για την μεταβλητή g " );
  int z = in.nextInt();
  g = z;
  System.out.println("Δώστε αριθμό για την μεταβλητή h  " );
  int y = in.nextInt();
  h = y;
  System.out.println("Δώστε αριθμό για την μεταβλητή p  " );
  int w = in.nextInt();
  p = w;
  
  long temp  ;
  boolean isTrue = true;
  int x = 0;
  while(isTrue)
  { 
   temp = 0 ;
   temp = ((g^x) % p );   
   if (h == temp){
    System.out.println("Ο διακριτός λογάριθμός είναι : " + x); 
    isTrue = false;
   }
   else{
    x = x + 1;}
   
   }
   
  }
  
 }
Δημοσ.

Δεν ειναι ο τελεστής που υψώνει σε δύναμη αυτος. Βασικά δεν υπαρχει τετοιος τελεστης στη java.

το αντικατέστησα με :

temp = (long) (( Math.pow(g,x)) % p );

 

και τώρα δεν τερματίζει ποτέ :/

Δημοσ.

Αν θεωρεις οτι ο αλγοριθμος σου ειναι σωστος τρεξε τον στο χαρτι με μικρα inputs να το διαπιστωσεις.

 

Προσωπικα δε καταλαβα τι θες να υλοποιησεις οποτε και δε μπορω να βοηθησω..

Δημοσ.

while(isTrue)

  { 

   temp = 0 ;

   temp = ((g^x) % p );   

   if (h == temp){

    System.out.println("Ο διακριτός λογάριθμός είναι : " + x); 

    isTrue = false;

   }

   else{

    x = x + 1;}

 

το h ?

sto if ( h==...

Δημοσ. (επεξεργασμένο)

το βρηκαααα :P απλα επειδη προέκυπταν τεράστιοι αριθμοί καθώς γινόταν ύψωση σε πολύ μεγάλες δυνάμεις οι long τιμές δεν μου έδιναν τις πραγματικές τιμές...κάνοντας χρήση BigInteger και χρησιμιμοποιώντας 2 μεθόδους 

1)temp = g.pow( exponent);

2)result = temp.mod(p);

προκύπτει το σωστό αποτέλεσμα....

 
(ευχαριστώ πάντως για το ενδιαφέρον) :)
Επεξ/σία από makisvisual

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...