Προς το περιεχόμενο
  • 0
Συνδεθείτε  
makisvisual

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

Ερώτηση

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

11 απαντήσεις σε αυτή την ερώτηση

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

  • 0

g^x

 

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

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

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

 

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Βασικά δεν υπαρχει τετοιος τελεστης στη java.

Υπάρχει τέτοιος τελεστής στη java, απλά κάνει άλλη δουλειά. 

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Υπάρχει τέτοιος τελεστής στη java, απλά κάνει άλλη δουλειά. 

Ηθελα να πω δεν υπάρχει τελεστής ανύψωσης.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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==...

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
Δημοσ. (επεξεργασμένο)

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

1)temp = g.pow( exponent);

2)result = temp.mod(p);

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

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

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

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

Χρήσιμες πληροφορίες

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.