C 带字节数组和8位整数的模算法:8位=字节%8位
我需要创建一个用C实现的算法,在任意数量的字节和一个字节之间进行模运算。见此:C 带字节数组和8位整数的模算法:8位=字节%8位,c,algorithm,modulo,C,Algorithm,Modulo,我需要创建一个用C实现的算法,在任意数量的字节和一个字节之间进行模运算。见此: typedef struct{ u_int8_t * data; u_int16_t length; }UBigInt; u_int8_t UBigIntModuloWithUInt8(UBigInt a,u_int8_t b){ } 对于二次幂,可以使用a&(b-1),但对于非二次幂呢 我意识到一种方法是:a-b*(a/b) 这需要使用UbigintVision with uint8和Ubigi
typedef struct{
u_int8_t * data;
u_int16_t length;
}UBigInt;
u_int8_t UBigIntModuloWithUInt8(UBigInt a,u_int8_t b){
}
对于二次幂,可以使用a&(b-1),但对于非二次幂呢
我意识到一种方法是:a-b*(a/b)
这需要使用UbigintVision with uint8和UbigintMultiplication with uint8以及UbigintSubtraction with Ubigint。有没有更有效的方法
多谢各位
这就是我现在的实现:
u_int8_t UBigIntModuloWithUInt8(UBigInt a,u_int8_t b){
if (!(b & (b - 1)))
return a.data[a.length - 1] & b - 1; // For powers of two this can be done
// Wasn't a power of two.
u_int16_t result = 0; // Prevents overflow in calculations
for(int x = 0; x < a.length; x++) {
result *= (256 % b);
result %= b;
result += a.data[x] % b;
result %= b;
}
return result;
}
u_int8_t UBigIntModuloWithUInt8(UBigInt a,u_int8_t b){
如果(!(b和(b-1)))
返回a.data[a.length-1]&b-1;//对于2的幂,可以这样做
//不是二的幂。
u_int16_t result=0;//防止计算溢出
对于(int x=0;x
您可以使用霍纳方法的变体。使用以下公式逐字节处理:
a%b=((a//256)%b)*(256%b)+(a%256)%b
,其中x//y是四舍五入除法(普通C整数除法)。这将起作用的原因是同余模b是一种等价关系。这样你就有了一个
O(长度)
算法,或者O(log(a))
示例代码段(未经测试,我的C语言技能已经过时):
u_int16_t result=0;//以防万一,防止溢出
对于(i=0,iyou说a
是一个任意的字节数;如果你能对b说些什么呢?它是常数吗?如果是,值是什么?我认为b
是一个任意的8位(无符号的?)integer.b可以是1-255。我需要为58实现它,但可能会有更多的情况。如果有专门针对58的优化解决方案,那么这将很好,但我可能需要为任何情况实现它。我想这是您不能/不想要的原因?~它内置了许多优化,甚至针对特定的处理器,就像那些为这类事情写这本书的人一样;)我看了看,觉得很头痛。:-)如果我能吃掉我所需要的零件,那就好了,但我无法绕过那个图书馆。在那个库或其他库中有我可以从中获取的代码吗?我发现了一个名为BigDigits的库,尽管它使用的是32位整数,而不是我想要的8位整数-(我不知道它是如何工作的,但从一个测试来看,它似乎是。我将实现它,并测试,然后返回给您。谢谢。谢谢,我用Python(本机支持任意大小的整数)测试了它,代码如下:在循环2分钟后,似乎没有给出任何错误,所以我想没问题;)请注意,我没有讨论零除,我添加了一个二次幂测试,修复了for循环,并给出了我的代码。
u_int16_t result = 0; // Just in case, to prevent overflow
for(i = 0, i<a.length; i++) {
result *= (256 % b);
result %= b;
result += (a[i] % b);
result %= b;
}