标签: integer-arithmetic

方程"a + bx = c + dy"的积分解

在等式中a + bx = c + dy,所有变量都是整数.a,b,c,和d是已知的.我如何找到xy?的整体解决方案?如果我想正确的,就会有解决方案无限多的,通过的最小公倍数分开bd,但我需要的是一个解决方案,我可以计算出的其余部分.这是一个例子:

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++ math equation equation-solving integer-arithmetic

7
推荐指数
1
解决办法
1671
查看次数

将两个128位整数相乘

我试图在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中?

c integer-arithmetic

7
推荐指数
2
解决办法
1017
查看次数

什么是有效的算法来逐位找到一个非常大的整数平方根?

我需要编写程序来查找长度为数千位的数字的整数平方根.我不能使用Newton Raphson,因为我没有数据类型来存储和划分这么大的数字.我在C中使用长数组来存储数字.是否有任何算法可以通过迭代数字找到平方根?

编辑:

我不能像GMP一样使用外部库.

c algorithm square-root integer-arithmetic

7
推荐指数
1
解决办法
4437
查看次数

长数组的确切总和

为了获得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)

java sum integer-arithmetic

7
推荐指数
1
解决办法
213
查看次数

使用LLVM的大数字运算(来自Haskell)

对我之前的问题的回答表明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)

haskell llvm gmp integer-arithmetic

7
推荐指数
1
解决办法
308
查看次数

将整数乘以有理数而没有中间溢出

我有一个表示非负有理数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但它似乎没有提供此功能.)

c c++ rational-numbers integer-arithmetic

7
推荐指数
1
解决办法
332
查看次数

Prolog:没有累加器的谓词最大值

是否有可能在max/2 没有累加器的情况下创建谓词,因此max(List, Max)当且仅当MaxList(整数列表)的最大值时才是真的?

list prolog integer-arithmetic

7
推荐指数
1
解决办法
287
查看次数

将x> = y转换为1或0而不使用分支或布尔表达式

我需要在没有分支或布尔表达式的情况下实现以下函数:

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,然后我完成了.

是否有某种方法只使用算术/按位运算(即没有分支或布尔表达式)?

谢谢.

c bit-manipulation integer-arithmetic

7
推荐指数
1
解决办法
294
查看次数

9933272057275866这是一个神奇的数字?

我遇到了问题,我无法解释它.其实我很惊讶.当我尝试将数字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环境中做同样的事情.结果相同!

怎么了?

javascript integer-arithmetic

7
推荐指数
1
解决办法
188
查看次数

为什么Rust的u64.pow期望使用u32?

为什么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)

https://doc.rust-lang.org/std/primitive.u64.html#pow.v

types integer rust integer-arithmetic

6
推荐指数
2
解决办法
273
查看次数