C++ 模乘反函数不';不适用于负数

C++ 模乘反函数不';不适用于负数,c++,modulo,inverse,C++,Modulo,Inverse,我有下面的函数来计算给定模数p的数n的模乘逆 int modInverse(int n, int p) { n %= p; for(int x = 1; x < p; x++) { if((n*x) % p == 1) return x; } } int modInverse(int n,int p){ n%=p; 对于(int x=1;x0)和&(r(-7+2+2+2)模(6)=>(-7+2+2+2)模(6)=>(1)模(7)=1 易于计算。第一

我有下面的函数来计算给定模数p的数n的模乘逆

int modInverse(int n, int p) {
    n %= p;
    for(int x = 1; x < p; x++) {
        if((n*x) % p == 1) return x;
    }
}
int modInverse(int n,int p){
n%=p;
对于(int x=1;x
如果n是正的,它是好的,但是如果n是负的,它总是0。 我怎样才能修好它

x模n的乘法逆:x^-1模n,是必须乘以x才能得到1模n的数 e、 g.3^-1 mod 7=5,因为3*5=1 mod 7示例代码:

int modulo(int n, int p)
{
int r = n%p;
    if(((p > 0) && (r < 0)) || ((p < 0) && (r > 0)))
        r += p;
    return r;
}

int modInverse(int n, int p) {
    n = modulo(n, p);
    for(int x = 1; x < p; x++) {
        if(modulo(n*x, p) == 1) return x;
    }
    return 0;
}

int main(void)
{
int r;
    r = modInverse(-25, 7);
    return 0;
}
int模(int n,int p)
{
int r=n%p;
如果((p>0)和&(r<0))| |((p<0)和&(r>0)))
r+=p;
返回r;
}
int modInverse(int n,int p){
n=模(n,p);
对于(int x=1;x
如果需要一个商和一个余数:

void divmod(int n, int p, int &q, int &r)
{
    q = n/p;
    r = n%p;
    if(((p > 0) && (r < 0)) || ((p < 0) && (r > 0))){
        q -= 1;
        r += p;
    }
}
void divmod(int n,int p,int&q,int&r)
{
q=n/p;
r=n%p;
如果((p>0)和&(r<0))| |((p<0)和&(r>0))){
q-=1;
r+=p;
}
}

除了不必要的迭代之外,您正在使用的方法具有
O(p)
复杂性。您可能希望使用具有
O(log(p))
复杂性的扩展欧几里德算法。无论如何,在回答您的问题和您的做法时,我建议您尝试这种方法,它可以减少迭代次数:(Java)

intcalculateinverse2(inta,intzp){
对于(inti=(int)Math.ceil((zp-1)/a);i
与模运算中的负值相关,取决于语言。尝试实现一种方法,将某些时间求和
p
,以确定整数环中的数字

例如:

(-7)模(2)=>(-7+2)模(2)=>(-7+2+2)模(2)=>(-7+2+2+2)模(6)=>(-7+2+2+2)模(6)=>(1)模(7)=1


易于计算。

第一个数字为负数的Mod是实现定义的,直到C++11@RobertHarvey我也尝试过这个,但我仍然得到了错误的结果。如果我尝试p=167的数字-17,我会得到59。rosettacode函数返回1。我不明白这个问题的反对票,这是个好问题。仍然不起作用。我尝试数字-25和7,得到的是5而不是3。如果我尝试r=模(-25,7),它返回一个3(使用Visual Studio)。(商应该是-4:-25/7=-4,rem=+3)。等一下。我不是在找模函数。我在寻找x模n的乘法逆:x^-1模n,是必须乘以x才能得到1模n的数字,例如3^-1模7=5,因为3*5=1模7-25模7==3,所以你在寻找3模7的逆,也就是5,因为(5*3)模7==1。如果我寻找-25模7的逆呢。这是否真的存在?
int calculateInverse2(int a, int zp) {
    for (int i = (int) Math.ceil((zp-1)/a); i < zp; i++) {
        if (Math.floorMod(a*i,zp) == 1) return i;
    }
    return -1;
}