Kezdőoldal » Számítástechnika » Programozás » C# multiplikatív inverz?

C# multiplikatív inverz?

Figyelt kérdés

Itt a programrészlet, aminek a maradékos multiplikatív inverzet kéne számolnia:


public int mod(int a, int b)

{

int i=0;


while (a % b != 1)

{

a = a + a;

++i;

}

return i;

}


Mi lehet a hiba benne?


maradékos multiplikatív inverz pl.:


7*x=1(mod 23)

7*10=1(mod 23) Tehát x-t keresem a programmal.


2013. jan. 2. 13:26
1 2
 1/12 A kérdező kommentje:

Megvan a megoldás, rosszat számoltam vele.


public int mod(int a, int b)

{


if (a == b + 1)

{

return 1;

}


else while (a % b != 1)

{

a = a + a;

}


return a/((b+1)+1);

}

2013. jan. 2. 13:56
 2/12 A kérdező kommentje:
Bár most csak néhány számra ad jó megoldást, szóval megint nem jó. :D
2013. jan. 2. 14:01
 3/12 anonim ***** válasza:

Csak épphogy volt időm ránézni, de sztem az első najdnem jó, csakhogy mindig önmagával növeled a-t, és nem az eredetivel, ami nem lesz jó.


A példádnál maradva, először a értéke 7, majd 14 lesz, ezután viszont 21 helyett 14+14=28, stb.

Javítottam:


public int mod(int a, int b)

{

int i = 1;

int osszeg = a;

while (osszeg % b != 1)

{

osszeg += a;

++i;

}

return i;

}

2013. jan. 2. 16:41
Hasznos számodra ez a válasz?
 4/12 anonim ***** válasza:

Formailag nem mond legyen a neve hanem pl multiplikativInverz.


Legyen egy x változó ami 0-tól b-1-ig azaz for (int x = 0; x < b; b++), ami ellenőrzi hogy (a*x) % b == 1 igaz-e ...

Ez lenne a triviális megoldás, ennél sokkal hatékonyabban is le lehet programozni, de akkor egy lineáris kongruencia megoldót kellene leprogramozni.

Egyébként meg feltételezted hogy mindig lesz a számnak multiplikatív inverze, ami nem igaz.

2013. jan. 2. 16:52
Hasznos számodra ez a válasz?
 5/12 anonim ***** válasza:

Írkálok hülyeségeket

"Formailag nem mond legyen a neve"

Formailag ne mod legyen a neve

És

for (int x = 0; x < b; x++)

2013. jan. 2. 16:55
Hasznos számodra ez a válasz?
 6/12 A kérdező kommentje:

De ha x-t növelem, akkor azt kapom meg, hogy hányszor növeltem meg 23-t(maradjunk eredeti példánál), hogy 7-tel osztva 1 legyen a maradék.


Nem pedig azt, hogy 7 hányszor van benne. Pedig úgy tűnik logikusnak, hogy ha 23-t megnövelem annyiszor, hogy a 7-es maradéka egyet adjon vissza, akkor hozzáadok egyet és elosztom 7-tel és az lesz x. De nem ad jó eredményt.

2013. jan. 2. 17:58
 7/12 anonim ***** válasza:

@17:58

Többször is elolvastam nem értem miért lenne logikus, de nem igaz.

Amit @16:41-es írt az jó megoldást ad ha van megoldás, különben végtelen ciklusba esik vagy az is lehet hogy túlcsordul és valami rossz megoldást ad.

pl. a=12, b=14 esetébe nincs megoldás.

Már leírtam a gondolatmenetet, de akkor most leírom a kódot is:

public int multiplikativInverz(int a,int b){

for (int x=0;x<b;x++){

if ( (a*x) % b == 1 )

return x;

}

return -1;

}


Mj.: Ha nincs megoldás akkor -1-et ad. (pozitív szám legyen a és b)

2013. jan. 2. 22:38
Hasznos számodra ez a válasz?
 8/12 A kérdező kommentje:
De ez még az eredeti példára sem ad jó megoldást. (23,7) esetén x=10, de ez a megoldás 4-t ad vissza. A túlcsordulás meg most lényegtelen, mert egyelőre azokat a számokat vizsgálom, melyek adnak jó megoldást.
2013. jan. 3. 09:38
 9/12 anonim ***** válasza:
Erre inkább nem mondok semmit, inkább leírom a működő kódot konkrétan az eredeti példára : [link]
2013. jan. 3. 11:34
Hasznos számodra ez a válasz?
 10/12 A kérdező kommentje:
Én fordítva kértem be a számokat, azért nem adott jó megoldást.Köszönöm.
2013. jan. 3. 11:40
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!