在等式中a + bx = c + dy,所有变量都是整数.a,b,c,和d是已知的.我如何找到x和y?的整体解决方案?如果我想正确的,就会有解决方案无限多的,通过的最小公倍数分开b和d,但我需要的是一个解决方案,我可以计算出的其余部分.这是一个例子:
a = 2
b = 3
c = 4
d = 5
a + bx: (2, 5, 8, 11, 14)
c + dy: (4, 9, 14, 19, 24)
a + bx intersects c + dy at 14, so:
x = 4
y = 2
Run Code Online (Sandbox Code Playgroud)
现在,我循环遍历整数值,x直到找到y(伪代码)的整数值:
function integral_solution(int a, int b, int …Run Code Online (Sandbox Code Playgroud) 我试图在C中乘以两个128位整数.
这是我的算法:
将两个128位序列拆分为S1和S2.
然后将S1分成S11(前/上半部分)和S12(后/下半部分)并将S2分成S21(前/上半部分)和S22(后/下半部分).
将S12乘以S22 ... = S1222.
将S11乘以S21 ... = S1121,然后将其乘以2 ^ 128进行位移
将S1222和S1121组合成新阵列的前半部分和后半部分.我们称之为"Array1".新数组的长度是S1的两倍.
然后我们必须将S12乘以S21并将S11乘以S22.我将这两个相乘得到S1221和S1122(并相应地对它们进行位移).现在我必须将它们添加到Array1.这是我要求帮助的部分.我不知道如何将这些一个一个地添加到Array1.请记住,当您从Array1的3/4到Array1的1/4时,可能会有一个1的进位,因为这是需要添加S1221和S1122的跨度.
我的问题是:如何将dstM1和dstM2添加到已填充的数组d中?
我需要编写程序来查找长度为数千位的数字的整数平方根.我不能使用Newton Raphson,因为我没有数据类型来存储和划分这么大的数字.我在C中使用长数组来存储数字.是否有任何算法可以通过迭代数字找到平方根?
编辑:
我不能像GMP一样使用外部库.
为了获得long[]我正在使用以下代码段的确切总和.
public static BigInteger sum(long[] a) {
long low = 0;
long high = 0;
for (final long x : a) {
low += (x & 0xFFFF_FFFFL);
high += (x >> 32);
}
return BigInteger.valueOf(high).shiftLeft(32).add(BigInteger.valueOf(low));
}
Run Code Online (Sandbox Code Playgroud)
通过处理分成两半的数字并最终组合部分和,它可以正常工作.令人惊讶的是,这种方法也有效:
public static BigInteger fastestSum(long[] a) {
long low = 0;
long high = 0;
for (final long x : a) {
low += x;
high += (x >> 32);
}
// We know that low has the lowest 64 bits of …Run Code Online (Sandbox Code Playgroud) 对我之前的问题的回答表明Haskell表示plusWord2#为llvm.uadd.with.overflow.我希望使用进位进行长时间的添加,就像x86 ADC指令的工作方式一样.该指令不仅添加了两个参数,还添加了进位的内容.
然后可以添加如下的长数字:
ADD x1 y1
ADC x2 y2
ADC x3 y3
...
Run Code Online (Sandbox Code Playgroud)
导致每个单词一个指令(忽略所需的任何周围移动等).
我查看了GMP库,以及它在通用C代码中如何进行长时间的添加.这是摘录自mpn/generic/add_n.c
sl = ul + vl;
cy1 = sl < ul;
rl = sl + cy;
cy2 = rl < sl;
cy = cy1 | cy2;
Run Code Online (Sandbox Code Playgroud)
注意,它保存了原始加法和进位位加法的进位.这些操作中只有一个可以携带,因此或者之后的携带就足够了.
显然,GMP具有针对特定平台的特定汇编代码,但我认为通用代码是一个很好的基础,因为它可能被编写为编译成合理的代码.在plusWord2#原始的操作手段,我不需要做无聊的比较,以获得进位,所以我实现了GMP的通用代码就像在Haskell如下:
addWithCarry :: Word# -> Word# -> Word# -> (# Word#, Word# #)
addWithCarry x y c =
let
(# c1, r1 #) = plusWord2# x y
(# c2, r2 …Run Code Online (Sandbox Code Playgroud) 我有一个表示非负有理数p/q的结构:
struct rational {
uint64_t p;
uint64_t q; // invariant: always > 0
};
Run Code Online (Sandbox Code Playgroud)
我想用uint64乘以理性n,得到一个整数结果,向下舍入.也就是说,我想计算:
uint64_t m = (n * r.p)/r.q;
Run Code Online (Sandbox Code Playgroud)
同时避免中间溢出n * r.p.(当然最终结果可能会溢出,这是可以接受的.)
我怎样才能做到这一点?有没有办法在没有高倍数的情况下做到这一点?
(我查看了boost :: rational但它似乎没有提供此功能.)
是否有可能在max/2 没有累加器的情况下创建谓词,因此max(List, Max)当且仅当Max是List(整数列表)的最大值时才是真的?
我需要在没有分支或布尔表达式的情况下实现以下函数:
uint8_t func(uint32_t num, uint8_t shl)
{
if (num >= (1 << shl))
{
return shl;
}
else
{
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我做的第一步是注意到这else部分很简单:
return num / (1 << shl);
Run Code Online (Sandbox Code Playgroud)
当然,在if部件中执行此操作不一定会产生所需的结果.
所以我想我需要更"聪明"的东西num / (1 << shl).
如果我能想出一个表达式,会给我1还是0,然后我完成了.
是否有某种方法只使用算术/按位运算(即没有分支或布尔表达式)?
谢谢.
我遇到了问题,我无法解释它.其实我很惊讶.当我尝试将数字9933272057275866增加1时,它会自动添加2 !!! 请参阅以下代码:
let test = 9933272057275866;
let test2 = test+1;
console.log('Before:', test);
console.log('After:', test2);
console.log('Sub:', test2-test);
Run Code Online (Sandbox Code Playgroud)
各自的输出:
Before: 9933272057275866
After: 9933272057275868
Sub: 2
Run Code Online (Sandbox Code Playgroud)
这怎么可能?
环境是Javascript.我在Hackerrank提交了一个挑战时发现了这个问题,然后我也尝试在我自己的node.js环境中做同样的事情.结果相同!
怎么了?
为什么Rust的u64原始u32函数期望指数?
error[E0308]: mismatched types
--> src/protagonists.rs:13:25
|
13 | return root.pow(self.secret) % prime;
| ^^^^^^^^^^^ expected u32, found u64
help: you can convert an `u64` to `u32` and panic if the converted value wouldn't fit
Run Code Online (Sandbox Code Playgroud)