Better ways to implement a modulo operation (algorithm question)

后端 未结 5 1456
孤城傲影
孤城傲影 2020-12-28 18:36

I\'ve been trying to implement a modular exponentiator recently. I\'m writing the code in VHDL, but I\'m looking for advice of a more algorithmic nature. The main componen

5条回答
  •  悲&欢浪女
    2020-12-28 19:30

    That test (modulus(n-1) != 1) //a bit test?

    -seems redundant combined with (modulus.

    Designing for hardware implementation i would be conscious of the smaller/greater than tests implying more logic (subtraction) than bitwise operations and branching on zero.

    If we can do bitwise tests easily, this could be quick:

    m=msb_of(modulus)
    
    while( result>0 ) 
    {
      r=msb_of(result) //countdown from prev msb onto result
      shift=r-m        //countdown from r onto modulus or 
                       //unroll the small subtraction 
    
      takeoff=(modulus<<(shift))  //or integrate this into count of shift
    
      result=result-takeoff;  //necessary subtraction
    
      if(shift!=0 && result<0)
      { result=result+(takeoff>>1); }
    
      } //endwhile
    
    if(result==0) { return result }
    else          { return result+takeoff }
    

    (code untested may contain gotchas)

    result is repetively decremented by modulus shifted to match at most significant bits.

    After each subtraction: result has a ~50/50 chance of loosing more than 1 msb. It also has ~50/50 chance of going negative, addition of half what was subtracted will always put it into positive again. > it should be put back in positive if shift was not=0

    The working loop exits when result is underrun and 'shift' was 0.

提交回复
热议问题