Avatar billede bamse2000 Nybegynder
26. marts 2003 - 21:29 Der er 27 kommentarer og
2 løsninger

BigInteger!!

Hej eksperter!

Jeg har kæmpet i 3 timer med at få foelgende til at passe, ved at bruge bigInteger klassen:

( 1299 * 949^853 ) mod 2579 = 2396

men får 2424.

argh!!!!!


Nogen der kan hjælpe?!?!

mange tak!
Avatar billede magoo20000 Nybegynder
26. marts 2003 - 21:35 #1
Med 949^853 mener du vel potens? Har du prøvet med Math.pow() metoden?
Avatar billede bamse2000 Nybegynder
26. marts 2003 - 21:36 #2
ja, desværre... Math.pow tager kun double, det er for lidt!
Avatar billede soreno Praktikant
26. marts 2003 - 21:38 #3
BigInteger har en pow metode.
BigInteger bi = new BigInteger(..);
bi.pow(853);
Avatar billede magoo20000 Nybegynder
26. marts 2003 - 21:38 #4
Mener da, at ^ tegnet bruges til at lave right og left shit... 2 min..
Avatar billede disky Nybegynder
26. marts 2003 - 21:38 #5
post din code
Avatar billede bamse2000 Nybegynder
26. marts 2003 - 21:38 #6
Får en "NaN" når den udskrives...
Avatar billede magoo20000 Nybegynder
26. marts 2003 - 21:38 #7
shift! *g*
Avatar billede soreno Praktikant
26. marts 2003 - 21:38 #8
Avatar billede disky Nybegynder
26. marts 2003 - 21:38 #9
magoo, nej det er << og >> du tænker på, ^er potens
Avatar billede bamse2000 Nybegynder
26. marts 2003 - 21:41 #10
BigInteger temp=(keys.beta).pow(keys.k);
temp.multiply(M);
y2=temp.mod(keys.p);

beta er 949, k er 853, M er 1299 og p er 2579
Avatar billede magoo20000 Nybegynder
26. marts 2003 - 21:41 #11
>> Disky... Du har helt ret! Det er vist min sengetid... Pinligt at jeg blander det sammen!
Avatar billede arne_v Ekspert
26. marts 2003 - 21:42 #12
Jeg får 2306:

import java.math.BigInteger;

public class Big {
    public static void main(String[] args) {
        BigInteger v = new BigInteger("949");
        v = v.pow(853);
        v = v.multiply(new BigInteger("1299"));
        v = v.mod(new BigInteger("2579"));
        System.out.println(v);
    }
}
Avatar billede soreno Praktikant
26. marts 2003 - 21:44 #13
Arne:
Jeg får 2396 med dit eksempel - men det er vel en tyrk fejl fra din side ?
Avatar billede bamse2000 Nybegynder
26. marts 2003 - 21:45 #14
Det skal give 2396!! Det får en "Maple" (et matematik-program) og fag-bogen..
Avatar billede arne_v Ekspert
26. marts 2003 - 21:46 #15
Ja.

Jeg ramte ved siden af.
Avatar billede arne_v Ekspert
26. marts 2003 - 21:46 #16
Bamse>

Det gør den også. Det jeg ramte bare 0 da jeg sigtede efter 9 !

:-)


Prøv selv !
Avatar billede disky Nybegynder
26. marts 2003 - 21:47 #17
import java.math.BigInteger;

/**
* Created by IntelliJ IDEA.
* User: Søren Reinke
* Date: Mar 26, 2003
* Time: 9:38:38 PM
* To change this template use Options | File Templates.
*/
public class StoreTal
{
    public StoreTal()
    {
        /*
        ( 1299 * 949^853 ) mod 2579 = 2396
        */
        BigInteger tal1=new BigInteger("949");

        tal1=tal1.pow(853);
        tal1=tal1.multiply(new BigInteger("1299"));
        tal1=tal1.mod(new BigInteger("2579"));
        System.out.println("resultat = "+tal1.toString());

    }
    public static void main(String[] args)
    {
        new StoreTal();
    }
}
Avatar billede disky Nybegynder
26. marts 2003 - 21:48 #18
Som giver det forventede resultat.


bamse, dit problem er denne linie:
temp.multiply(M);

ret til
temp=temp.multiply(M);
Avatar billede bamse2000 Nybegynder
26. marts 2003 - 21:50 #19
okay... det får jeg også med jeres eksempel! Tak, men hvad hvis

v = v.pow(853);

853 er et BigInteger istedet, f.eks. k?
Avatar billede arne_v Ekspert
26. marts 2003 - 21:51 #20
pow er kun med int !

Du må bruge k.intValue() !
Avatar billede disky Nybegynder
26. marts 2003 - 21:52 #21
bamse2000:

API'en fra SUN er din ven, der kan du se hvilke metoder du kan kalde på BigInteger objekter.

Eller hvis du bruger et ordentligt udviklingsværktøj som f.eks. IntelliJ så kan den vise dig det.
Avatar billede bamse2000 Nybegynder
26. marts 2003 - 21:54 #22
hm... hvor langt kan et "int" blive? jeg skal bruge store k-værdier...
Men tror jeg har fundet ud af noget... tak!
Avatar billede bamse2000 Nybegynder
26. marts 2003 - 21:54 #23
tak disky, har kigget...
Avatar billede arne_v Ekspert
26. marts 2003 - 21:54 #24
2.1 milliard
Avatar billede soreno Praktikant
26. marts 2003 - 21:56 #25
Igen, api'et:
System.out.println(Integer.MIN_VALUE);  //-2^31
System.out.println(Integer.MAX_VALUE);  //2^31-1
Avatar billede bamse2000 Nybegynder
26. marts 2003 - 21:57 #26
okay, det er fordi jeg laver en opgave i cryptering, hvor k skal være et 512-bit langt primtal....
Avatar billede disky Nybegynder
26. marts 2003 - 21:58 #27
Hvad er du egentligt ved at regne ud ?

De tal du bruger er størrer end antal atomer i universet (hvis man skal tro min fysik bog)
Avatar billede disky Nybegynder
26. marts 2003 - 21:59 #28
ah :-) tak for svaret.
Avatar billede arne_v Ekspert
26. marts 2003 - 22:10 #29
En special pow:

import java.math.BigInteger;

public class Big {
    public static void main(String[] args) {
        BigInteger v = new BigInteger("949");
        v = pow(v, new BigInteger("853"));
        v = v.multiply(new BigInteger("1299"));
        v = v.mod(new BigInteger("2579"));
        System.out.println(v);
    }
    private final static int scale1 = Integer.MAX_VALUE;
    private final static BigInteger scale2 = new BigInteger(Integer.toString(scale1));
    public static BigInteger pow(BigInteger b, BigInteger k) {
        BigInteger k2 = k;
        BigInteger res = new BigInteger("1");
        while(k2.compareTo(scale2) > 0) {
            res = res.multiply(b.pow(scale1));
            k2 = k2.subtract(scale2);
        }
        res = res.multiply(b.pow(k2.intValue()));
        return res;
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester