matlab非素数置0,Matlab:支持非质数模量的线性同余求解器?

我想知道您以前是否尝试使用sym/linsolve和sym/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::linsolve或linalg::matlinsolve.sym/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 / solve或sym / 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和其他求解器将来可以更好地处理系统.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值