数学建模社区-数学中国

标题: 新手问题,为什么无法求解...... [打印本页]

作者: 瞧红尘    时间: 2013-8-30 17:47
标题: 新手问题,为什么无法求解......
求解 s1,A,B

model:
!都是32位无符号整数;
@gin(A);
@gin(B);
@gin(s1);
@gin(s2);
@gin(s3);
@gin(s4);
@gin(s5);
@gin(s6);
@gin(s7);
s2=@mod(s1*A+B,4294967296); !计算机中32位无符号数;
s3=@mod(s2*A+B,4294967296);
s4=@mod(s3*A+B,4294967296);
s5=@mod(s4*A+B,4294967296);
s6=@mod(s5*A+B,4294967296);
s7=@mod(s6*A+B,4294967296);
!..............;

@mod( @mod( @floor(s1/65536),32768 ) ,136) = 93;
@mod( @mod( @floor(s2/65536),32768 ) ,136) = 128;
@mod( @mod( @floor(s3/65536),32768 ) ,136) = 111;
@mod( @mod( @floor(s4/65536),32768 ) ,136) = 112;
@mod( @mod( @floor(s5/65536),32768 ) ,136) = 24;
@mod( @mod( @floor(s6/65536),32768 ) ,136) = 102;
@mod( @mod( @floor(s7/65536),32768 ) ,136) = 82;
!..............;
end



我知道解为
s1=23932311
A=214013
B=2531011
想知道怎么求出来....

作者: wujianjack2    时间: 2013-8-30 22:48
   楼主你好,抱歉我没有解决你的问题。
   如果你还继续看的话这里我给出我的几点建议:
   一.以我目前对LINGO的认识来看,LINGO的专长是优化领域,而我认为,优化问题都是要求在一定的假设下给出的相对比较满意的结果。结果并不具有绝对的精确性,而楼主想求解的这个问题是一个要求精确值的数学问题,可能LINGO的算法对此并不具有高效率的求解性;
   二.LINGO求解问题,也是有自己的算法的。我们在一般的使用中,其API的各种参数均采用默认值,就能求解出来一般遇到的问题。我目前也没有接触到比较复杂的问题,也因为个人见识的一些局限没有对API设置进行研究,如果楼主实在想解决此题,可以在这方面了解下;
   三.或许LINGO可以求解此题,但是,对于这个问题本身,我想问楼主,你确定解是唯一的么?如果不是唯一的,那么很可能就存在一个比较大的搜索空间,这样在时间上的开销就不很好预测与控制了;
   四.对于这种类型的题目,楼主或许可以尝试其它软件,比如:MATLAB,Mathematica,它们有着卓越的数值计算功能,或许可以解决这样的问题。
   以上是我个人的一些观点,再次向楼主表示歉意,我没有对此做出比较好的答复。
作者: madio    时间: 2013-8-31 08:15
你的这个问题出在这段代码中
s2=@mod(s1*A+B,4294967296); !计算机中32位无符号数;
s3=@mod(s2*A+B,4294967296);
s4=@mod(s3*A+B,4294967296);
s5=@mod(s4*A+B,4294967296);
s6=@mod(s5*A+B,4294967296);
s7=@mod(s6*A+B,4294967296);

因为如果s1,A,B取到你所需要的值,s1*A就超过了计算机整数的最大值了,所以不可能给出结果的
作者: madio    时间: 2013-8-31 08:19
  1. <p>model:</p><p>!都是32位无符号整数;</p><p>
  2. </p><p>
  3. </p><p>@gin(A);</p><p>@gin(B);</p><p>@gin(s1);</p><p>@gin(s2);</p><p>@gin(s3);</p><p>@gin(s4);</p><p>@gin(s5);</p><p>@gin(s6);</p><p>@gin(s7);</p><p>s2=@mod(s1+B,4294967296); !计算机中32位无符号数;</p><p>s3=@mod(s2+B,4294967296);</p><p>s4=@mod(s3+B,4294967296);</p><p>s5=@mod(s4+B,4294967296);</p><p>s6=@mod(s5+B,4294967296);</p><p>s7=@mod(s6+B,4294967296);</p><p>!..............;</p><p>
  4. </p><p>@mod( @mod( @floor(s1),32768 ) ,136) = 93;</p><p>@mod( @mod( @floor(s2),32768 ) ,136) = 128;</p><p>@mod( @mod( @floor(s3),32768 ) ,136) = 111;</p><p>@mod( @mod( @floor(s4),32768 ) ,136) = 112;</p><p>@mod( @mod( @floor(s5),32768 ) ,136)= 24;</p><p>@mod( @mod( @floor(s6),32768 ) ,136) = 102;</p><p>@mod( @mod( @floor(s7),32768 ) ,136) = 82;</p><p>!..............;</p><p>end</p>
复制代码
你如果将程序改为上面的形式,就可以运行,你要注意整数是有最大值上限的


作者: 瞧红尘    时间: 2013-8-31 15:43
madio 发表于 2013-8-31 08:19
你如果将程序改为上面的形式,就可以运行,你要注意整数是有最大值上限的

对于溢出,刚试验了一下。
   数量级过大会报205错误。不是这个原因。
作者: 瞧红尘    时间: 2013-8-31 16:19
wujianjack2 发表于 2013-8-30 22:48
楼主你好,抱歉我没有解决你的问题。
   如果你还继续看的话这里我给出我的几点建议:
   一.以我目前 ...

这个是个复合非线性函数。求解的是 0-0xffffffff 范围的整数值。
听说lingo主要是线性求解。

我用MATLAB,Mathematica试试。感谢了
作者: madio    时间: 2013-8-31 18:42
很明显是超过了上限,你可以将初始值放在你要的解附近进行求解就看出来了
作者: 瞧红尘    时间: 2013-9-2 10:55
madio 发表于 2013-8-31 18:42
很明显是超过了上限,你可以将初始值放在你要的解附近进行求解就看出来了

关键问题就是这三个数范围都是0-0xffffffff
自己写程序用循环嵌套来求,好像要运行,预计百万年才能有结果...
作者: 瞧红尘    时间: 2013-9-2 11:04
madio 发表于 2013-8-31 18:42
很明显是超过了上限,你可以将初始值放在你要的解附近进行求解就看出来了

另外,我重新下载了一个lingo,发现不会直接出错,而是一直运行.....
可能是选项配置的问题.




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5