Защо Matlab Mod е различен от Wolfram Alpha

688^79 mod 3337 = 1570.

Когато опитах това във wolfram alpha, получих: въведете описание на изображението тук

но когато въведох същото в Matlab, получавам 364 като отговор. Трябва да правя нещо нередно.

въведете описание на изображението тук

Всяка светлина върху това ще бъде оценена.


person Juan Zamora    schedule 26.04.2015    source източник
comment
Някакво преливане може би?   -  person codingEnthusiast    schedule 27.04.2015
comment
може да бъде, позволете ми да направя бърз тест с по-малка стойност   -  person Juan Zamora    schedule 27.04.2015
comment
с mod(4^3,24) и wolfram, и matlab показват същия резултат == 16   -  person Juan Zamora    schedule 27.04.2015
comment
1570 е правилно (изчислено с python). Опитайте mod(double(688^79), 3337)   -  person codingEnthusiast    schedule 27.04.2015
comment
не, все още получавам 364   -  person Juan Zamora    schedule 27.04.2015
comment
Просто ги запазете като sym и ще можете да го изчислите правилно.   -  person codingEnthusiast    schedule 27.04.2015


Отговори (2)


Причината е, че Matlab използва double аритметика с плаваща запетая по подразбиране. Число толкова голямо, колкото 688^79, не може да бъде представено точно като double. (Най-голямото цяло число, което може да бъде точно представено като double, е от от порядъка на 2^53).

За да получите правилния резултат, можете да използвате символни променливи, което гарантира, че няма да загубите точността:

>> x = sym('688^79');
>> y = sym('3337');
>> mod(x, y)
ans =
1570
person Luis Mendo    schedule 26.04.2015
comment
@JuanZamora ¡Un placer! :-) - person Luis Mendo; 27.04.2015
comment
Вашият пример използва пълна символична математика, а не променлива точност. Изглежда, че няма причина да се използва променлива точност тук. Използването на променлива точност с vpa означава, че имате краен, но регулируем брой цифри на точност. Може би не разбирам какво се опитвате да кажете – вие не губите точност по отношение на зададената от вас стойност за digits, но в manu случаи можете абсолютно да загубите точност спрямо истинската стойност, използвайки vpa. - person horchler; 27.04.2015
comment
@LuisMendo провери това: 79^-1 mod 3220 = 1019 във волфрам. В matlab просто връща 1/79 = 0,0126... Опитах символичното беше, но без успех. - person Juan Zamora; 27.04.2015
comment
@JuanZamora Това е малко по-нюансирано. WolframAlpha изглежда решава модулна обратна задача за входа 79^-1 mod 3220 (тълкува се като PowerMod[79,-1,3220], но ще реши проблемът със стандартния остатък за 1/79 mod 3220 (интерпретиран като Mod[79^-1,3220]). - person TroyHaskin; 27.04.2015
comment
@horchler Вие сте напълно прав. Опитвах няколко неща и в крайна сметка не използвах vpa, но обяснението беше грешно. Благодаря! Коригирах го - person Luis Mendo; 27.04.2015

Моят калкулатор ми изпраща същия отговор като Wolfram, той също така изчисли стойността за 688^79, така че съм склонен да повярвам, че Wolfram е прав. Вероятно сте превишили капацитета на Matlab с такъв огромен брой и затова не е изпратил правилния отговор.

person Cedric    schedule 26.04.2015
comment
за протокола вашият номер е 14773609675417530323005367743110807899342277905652162178851613563818799499589919281425897722116091402282562829918 0402236602527982600775671266557420283463691946979929718178787089203370822514764608144873171356044647950190641152 Точка - person Cedric; 27.04.2015