Find the first positive solution of a modular equation.

64 Views Asked by At

Consider 2 positive integers $n>0$ and $m>0$ (that can be arbitrarily large).

Is there a mathematical method or an algorithm (no brute force) to find the first positive solution $k >0$ of the equation : $$(n+1 - k)\mod (n+1) =k\mod (m +1) $$ For example:

  1. if $n = 2$ and $m = 10$, $k = 13$ because : $(3 - 13) \mod 4 = 2 = 13 \mod 11$
  2. if $n = 10$ and $m = 2$, $k = 10$ because : $(11 - 10) \mod 11 = 1 = 10 \mod 3$
  3. if $n = 7$ and $m = 9$, $k = 4$ because : $(8 - 4) \mod 8 = 4 = 4 \mod 9$

For now, I have tried to consider the equation : $$f(n+1-x,n+1)=f(x,m+1)$$ where $f(x,k)=x-k\left\lfloor \frac{x}{k} \right\rfloor$

But it didn't lead to something interessant. I finally got a relatively efficient algorithm and now wonder if there is a closed formula or an improved algorithm :

def f(n, m):
    if n == m:
        return (n + 1) // 2 if n % 2 else n + 1
    if n % 2 and m >= (n + 1) // 2:
        return (n + 1) // 2
    if n < m:        
        a, b = 0, n + 1
        while 1:
            k = (a + b) // 2
            if (n + 1 - k) % (n + 1) == k % (m + 1):                
                return k
            b += n + 1            
            if b > a + 2 * (n + 1):
                a += m + 1
                b = (a // (n + 1)) * (n + 1)            
                while b < a:
                    b += n + 1
    else:
        a, b = ((n + 1) // (m + 1)) * (m + 1), n + 1
        while b - (a - (m + 1)) <= 2 * (m + 1):
            a -= m + 1    
       while 1:
            k = (a + b) // 2
            if (n + 1 - k) % (n + 1) == k % (m + 1):
                return k             
            if a + m + 1 < b:
                a += m + 1
            else:
                b += n + 1   
                a = (b // (m + 1)) * (m + 1)
                while b - (a - (m + 1)) <= 2 * (m + 1):
                    a -= m + 1                     
    return 0