C++ 如果有另一个因子和溢出的乘积,如何计算因子?

C++ 如果有另一个因子和溢出的乘积,如何计算因子?,c++,c,x86,dword,C++,C,X86,Dword,我有一个看起来相当复杂的乘法/imul问题:如果我有a和b,如果它们都是32位DWORD(例如,0-1=FFFFFFFF,FFFFFFFF+1=0),我如何计算x? 例如: a * x = b 在这种情况下,x是0x1908c643。我发现了一个类似的问题,但前提是不同的,我希望有一个比给出的更简单的解决方案。当数字是奇数时,它们有一个模乘逆模2的幂。其他的都是位移位奇数(偶数零,可能是任何数字,所有位都移位了)。因此有几个案例: 给定a*x=b tzcnt(a)>tzcnt(b)无解决方案

我有一个看起来相当复杂的乘法/imul问题:如果我有a和b,如果它们都是32位DWORD(例如,0-1=FFFFFFFF,FFFFFFFF+1=0),我如何计算x? 例如:

a * x = b

在这种情况下,x是0x1908c643。我发现了一个类似的问题,但前提是不同的,我希望有一个比给出的更简单的解决方案。

当数字是奇数时,它们有一个模乘逆模2的幂。其他的都是位移位奇数(偶数零,可能是任何数字,所有位都移位了)。因此有几个案例:

给定
a*x=b

  • tzcnt(a)>tzcnt(b)
    无解决方案

  • tzcnt(a)>tzcnt(a))*(b>>tzcnt(a))
    是一种解决方案,因为您将
    a
    写成
    (a>>tzcnt(a))*(1分为大小,进行4次乘法和加法运算。(L1+S1)*(L2+S2)这可能并不总是有一个唯一的解决方案,我不确定。我的第一个想法是找到编译器将除法转换为乘法的方法,这对于32位整数之类的模块类型是可能的。当然,对于除法
    0xcb9102df
    。(乘法逆存在于被小整数除法中,就像我在godbolt链接中包含的div13函数一样)
    4*x=?2
    ,是溢出的数字。我能恢复x吗?非常感谢!它很有效,这正是我想要的。不过,我不完全理解。与其让你解释一个庞大的主题,你能不能给我介绍一个我可以用谷歌搜索的一般主题/一本书来阅读?谢谢!(如果美国系统适用,我目前在Alg 2)@卢佩,好吧,也许,问题出在哪里?@卢佩,我不知道该告诉你什么,他们可能会在Alg 2中讨论这个问题,也许不会。无论哪种方式,奇数的乘性逆模2的幂的存在都是从2的幂和奇数为1的gcd和贝佐特的恒等式之间得出的。它也非常直观地从met得出的如何构造它们:从1开始构造逆,然后看哪一位是需要抵消的最低位,加上2的相关幂,等等。逆的算法是牛顿方法的一个应用。其余的我想是显而易见的?@harold:是的,它是关于用乘法代替除法,而不是使用乘法乘法是另一个乘法的逆运算。我说我以前没听说过后者,但我想这两者之间可能有某种联系,或者至少这是另一个有趣的工具,即使你不太懂数学,也可以放在你的魔术袋里。(我想当我需要自己实现它的时候,我会读更多的书并理解它。在那之前,我很高兴知道它的存在)。谢谢你总结了寻找逆,特别是确认那些是牛顿迭代
    0xcb9102df * x = 0x4d243a5d
    
    ; input x
    dword y = (x * x) + x - 1;
    dword t = y * x;
    y *= 2 - t;
    t = y * x;
    y *= 2 - t;
    t = y * x;
    y *= 2 - t;
    ; result y