【问题标题】:Matlab: linear congruence solver that supports a non-prime modulus?Matlab:支持非素模的线性同余求解器?
【发布时间】:2013-12-01 20:43:55
【问题描述】:

我正在编写一些 Matlab 代码来对给定的密码系统执行称为索引微积分攻击的操作(这涉及计算离散的对数值),除了一件小事之外,我已经完成了所有工作。我不知道(在 Matlab 中)如何解决同余 mod p 的线性系统,其中 p 是 not 素数。另外,这个系统有不止一个变量,所以,除非我遗漏了什么,否则中国剩余定理是行不通的。

我问了一个关于数学 stackexchange 的问题,其中包含更多详细信息/格式化的 mathjax here。我在那个链接的问题中解决了这个问题,现在我正在尝试找到一个实用程序,它可以让我解决以非素数为模的同余系统。我确实找到了一个包含支持模运算的求解器的套件,但模数必须是素数(here)。我也尝试逐步修改它以使用非素数,但无论使用哪种方法都不起作用,因为它要求系统的所有元素都具有逆模 p。

我已经研究过使用 Matlab 中调用 MuPAD 函数的功能,但根据我的测试,MuPAD 函数 linsolve(这似乎是最佳候选者)也不支持非素模值。此外,我已经用 Maple 验证了这个系统可以以我感兴趣的整数 (8) 为模求解,因此可以完成。

更具体地说,这是我试图在 MuPAD 中运行的确切命令:

linsolve([0*x + 5*y + 4*z + q = 2946321, x + 7*y + 2*q = 5851213, 8*x + y + 2*q = 2563617, 10*x + 5*y + z = 10670279],[x,y,z,q], Domain = Dom::IntegerMod(8))

Error: expecting 'Domain=R', where R is a domain of category 'Cat::Field' [linsolve]

如果我将域更改为 IntegerMod(23) 和 IntegerMod(59407),相同的命令会返回正确的值,所以我认为 8 不合适,因为它不是素数。这是我尝试上述命令时的输出,其中每个 23 和 59407 作为我的域:

[x = 1 mod 23, y = 1 mod 23, z = 12 mod 23, q = 14 mod 23]

[x = 14087 mod 59407, y = 1 mod 59407, z = 14365 mod 59407, q = 37320 mod 59407]

这些答案是正确的 - xyzq 对应于位于我的同余系统中的 L1L2L3L4上面的 Math.StackExchange 链接。

【问题讨论】:

  • 我想知道您是否可以通过Computational Science Stack Exchange 获得更多帮助(并且更深入地了解此类问题)?
  • 当然,我也会在那里问,谢谢你的提示!有什么特别的原因可以让我在这里跑题吗?
  • 这是一个编程站点,因此显示一些代码和预期的输出总是有帮助的。例如,您在 Math.StackExchange 链接中显示的 4×4 示例中使用的 Matlab 代码。我不清楚您所说的 linsolve 不工作是什么意思(甚至您的意思是三个 linsolve 函数中的哪一个)。您是否期望不止一种解决方案,但求解器是returning just one?有没有实现这个的C代码? – 你也许可以创建一个 mex 函数。
  • 感谢您的回复-抱歉,我事先没有任何代码。我已经添加了我看到的确切问题。如果还有什么我可以提供的,请告诉我。抱歉,我是 StackOverflow 和 StackExchange 的新手
  • 我非常无知,但你不能用其他数值方法(例如nlinfit)“暴力破解”线性系统的近似解吗?

标签: matlab cryptography linear-algebra symbolic-math mupad


【解决方案1】:

我想知道您之前是否尝试过使用sym/linsolvesym/solve,但可能传入的是数字值而不是符号值。例如,这会返回关于您要查找的内容的废话:

A = [0 5 4 1;1 7 0 2;8 1 0 2;10 5 1 0];
b = [2946321;5851213;2563617;10670279];
s = mod(linsolve(A,b),8)

但是,如果您将数值转换为符号整数,sym/linsolve 会将所有内容保留为有理分数。那么

s = mod(linsolve(sym(A),sym(b)),8)

返回预期的答案

s =

 6
 1
 6
 4

这只是使用符号数学求解系统线性系统,就好像它是一个普通矩阵一样。对于大型系统,这可能会很昂贵,但我想最多只能使用 MuPAD 的numeric::linsolvelinalg::matlinsolvesym/mod 应该返回每个解组件的分子的模数。我相信如果模数和分母不是至少coprime,你会得到一个错误。

sym/solve也可以用类似的方式解决这个问题:

L = sym('L',[4,1]);
[L1,L2,L3,L4] = solve(A*L==b);
s = mod([L1;L2;L3;L4],8)

使用sym/solvesym/linsolve 的一个可能问题是,如果线性同余问题(与线性系统相反)有多种解决方案,则此方法可能不会返回所有解决方案。

最后,使用 MuPAD 函数numlib::ichrem(整数的中国余数定理),下面是一些试图获得完整解的代码:

A = [0 5 4 1;1 7 0 2;8 1 0 2;10 5 1 0];
b = [2946321;5851213;2563617;10670279];
m = 10930888;

mf = str2num(strrep(char(factor(sym(m))),'*',' '));
A = sym(A);
b = sym(b);
s = sym(zeros(length(b),length(mf)));
for i = 1:length(mf)
    s(:,i) = mod(linsolve(A,b),mf(i));
end

mstr = ['[' sprintf('%d,',mf)];
mstr(end) = ']';
r = sym(zeros(length(b),1));
for i = 1:length(b)
    sstr = char(s(i,:));
    r(i) = feval(symengine,'numlib::ichrem',sstr(9:end-2),mstr);
end
check = isequal(mod(A*r,m),b)

我不确定这是否是您正在寻找的东西,但希望它可能会有所帮助。我认为在 MathWorks 中添加 enhancement/service request 可能是个好主意,这样 MuPAD 和其他求解器将来可以更好地处理系统。

【讨论】:

  • 这一切看起来都很棒,尤其是关于将矩阵转换为符号的顶部部分——非常感谢!我刚刚尝试在我自己的机器上复制它,但我收到一个错误,即 linsolve 不支持 sym 参数。这是一个新功能吗?我正在使用 7.11.0 (R2010b)
  • 在尝试了 sym/linsolve 帮助页面中的示例后,我得到了同样的错误:“未定义函数或方法 'linsolve' 用于类型为 'sym' 的输入参数。”所以我猜 sym/linsolve 不存在于 R2010b 中?
  • 抱歉回复晚了。符号数学工具箱数学工具箱多年来发生了很大变化,因此您可能不应该查看 Google 提供的在线文档(尽管旧版本的存档文档是 here)。而是使用dochelp 函数。即使sym/linsolve 在 R201b 中不存在,我想您也可以使用我上面显示的sym/solve 版本。您可能需要将矩阵方程转换为四个字符串方程——我不知道。
  • 不用担心 - 感谢您的任何回复!我实际上一直在尝试使用求解功能,但我遇到了麻烦。我寻求帮助解决另一个问题here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
相关资源
最近更新 更多