int mpi_fdiv_r( MPI rem, MPI dividend, MPI divisor ) { int rc = -ENOMEM; int divisor_sign = divisor->sign; MPI temp_divisor = NULL; /* We need the original value of the divisor after the remainder has been * preliminary calculated. We have to copy it to temporary space if it's * the same variable as REM. */ if( rem == divisor ) { if (mpi_copy( &temp_divisor, divisor ) < 0) goto nomem; divisor = temp_divisor; } if (mpi_tdiv_qr(NULL, rem, dividend, divisor ) < 0) goto nomem; if( ((divisor_sign?1:0) ^ (dividend->sign?1:0)) && rem->nlimbs ) if (mpi_add( rem, rem, divisor) < 0) goto nomem; rc = 0; nomem: if( temp_divisor ) mpi_free(temp_divisor); return rc; }
int mpi_fdiv_qr( MPI quot, MPI rem, MPI dividend, MPI divisor ) { int divisor_sign = divisor->sign; MPI temp_divisor = NULL; if( quot == divisor || rem == divisor ) { if (mpi_copy( &temp_divisor, divisor ) < 0) return -ENOMEM; divisor = temp_divisor; } if (mpi_tdiv_qr( quot, rem, dividend, divisor ) < 0) goto nomem; if( (divisor_sign ^ dividend->sign) && rem->nlimbs ) { if (mpi_sub_ui( quot, quot, 1 ) < 0) goto nomem; if (mpi_add( rem, rem, divisor) < 0) goto nomem; } if( temp_divisor ) mpi_free(temp_divisor); return 0; nomem: mpi_free(temp_divisor); return -ENOMEM; }
void mpi_fdiv_qr( MPI quot, MPI rem, MPI dividend, MPI divisor ) { int divisor_sign = divisor->sign; MPI temp_divisor = NULL; if( quot == divisor || rem == divisor ) { temp_divisor = mpi_copy_gpg( divisor ); divisor = temp_divisor; } mpi_tdiv_qr( quot, rem, dividend, divisor ); if( (divisor_sign ^ dividend->sign) && rem->nlimbs ) { mpi_sub_ui( quot, quot, 1 ); mpi_add( rem, rem, divisor); } if( temp_divisor ) mpi_free_gpg(temp_divisor); }
void mpi_tdiv_r( MPI rem, MPI num, MPI den) { mpi_tdiv_qr(NULL, rem, num, den ); }
int mpi_tdiv_r( MPI rem, MPI num, MPI den) { return mpi_tdiv_qr(NULL, rem, num, den ); }