2016-12-22 6 views
2

У меня проблема с выходом функции mod в Matlab. Я пытаюсь выполнить некоторые вычисления для двойного алгоритма ECC и добавить алгоритм. Я читаю данные из файла и сохраняю его в переменной, а затем выполняю некоторые операции. Все работает плавно, за исключением того, что я получаю 0 в temp1, когда использую mod(X2,P). Однако, если я вставляю значения, хранящиеся в X2(3.0323e+153) и P(1.1579e+77) в командном окне (mod(3.0323e+153, 1.1579e+77)), я получаю правильные значения. Кто-нибудь может мне помочь, пожалуйста! Ниже приведена часть сценария, которая является проблематичной.Функция функции Mod 0 для Matlab

P = hex2dec('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F'); 
line = fread(fileID,[1,67],'*char'); 
while ~feof(fileID) 
     PX = line(4:67); 
     X = hex2dec(PX); 
     X2 = X^2; 
     temp1= mod(X2 , P) 
    end 
    line = fread(fileID,[1,69],'*char'); 
end 
fclose(fileID); 

ответ

3

Я думаю, проблема заключается в том, как вы инициализируете P. Из документации hex2dec (курсив):

d = hex2dec('hex_value') преобразует hex_value его с плавающей точкой целочисленного представления. Аргумент hex_value - это шестнадцатеричное целое число, сохраненное в виде текста. Если значение hex_value больше, чем шестнадцатеричный эквивалент значения, возвращаемого flintmax, то hex2dec может не возвращать точное преобразование.

И ценность flintmax является:

>> flintmax 
ans = 
    9.007199254740992e+15 

Совсем немного меньше, чем значение для P. В самом деле, если мы используем num2hex, чтобы посмотреть на два способах инициализации P, вы можете увидеть четкую разницу:

>> P = hex2dec('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F'); 
>> num2hex(P) 
ans = 
4ff0000000000000 
>> num2hex(1.1579e+77) 
ans = 
4fefffda293c30de 

Как выясняется, неточное преобразование сделаны по hex2dec результатам в ряде, который равномерно разделяется на 3.0323e+153, таким образом, давая вам остаток 0:

>> mod(3.0323e+153, P) 
ans = 
    0 
>> mod(3.0323e+153, 1.1579e+77) 
ans = 
    8.795697942083107e+76 
+0

Да, это проблема, так Matlab не может обрабатывать 256 битное число арифметических операций. Знаете ли вы какую-либо библиотеку или добавляете, на которой можно работать с MATLAB для 256-битной арифметики? – Eshaal

+0

@ Eshaal: Возможно, ['vpa'] (https://www.mathworks.com/help/symbolic/vpa.html) из Symbolic Math Toolbox? – gnovice