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

δεν υπολογίζει σωστά το mod % (java)


makisvisual

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

Καλησπέρα παιδιά , έχω δημιουργήσει ένα πρόγραμμα ώστε να υπολογίζει τον εκθέτη (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
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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