Back to index

php5  5.3.10
Functions
raisemod.c File Reference
#include <config.h>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdarg.h>
#include "bcmath.h"
#include "private.h"

Go to the source code of this file.

Functions

int bc_raisemod (bc_num base, bc_num expo, bc_num mod, bc_num *result, int scale TSRMLS_DC)

Function Documentation

int bc_raisemod ( bc_num  base,
bc_num  expo,
bc_num  mod,
bc_num result,
int scale  TSRMLS_DC 
)

Definition at line 46 of file raisemod.c.

{
  bc_num power, exponent, parity, temp;
  int rscale;

  /* Check for correct numbers. */
  if (bc_is_zero(mod TSRMLS_CC)) return -1;
  if (bc_is_neg(expo)) return -1;

  /* Set initial values.  */
  power = bc_copy_num (base);
  exponent = bc_copy_num (expo);
  temp = bc_copy_num (BCG(_one_));
  bc_init_num(&parity TSRMLS_CC);

  /* Check the base for scale digits. */
  if (base->n_scale != 0)
      bc_rt_warn ("non-zero scale in base");

  /* Check the exponent for scale digits. */
  if (exponent->n_scale != 0)
    {
      bc_rt_warn ("non-zero scale in exponent");
      bc_divide (exponent, BCG(_one_), &exponent, 0 TSRMLS_CC); /*truncate */
    }

  /* Check the modulus for scale digits. */
  if (mod->n_scale != 0)
      bc_rt_warn ("non-zero scale in modulus");

  /* Do the calculation. */
  rscale = MAX(scale, base->n_scale);
  while ( !bc_is_zero(exponent TSRMLS_CC) )
    {
      (void) bc_divmod (exponent, BCG(_two_), &exponent, &parity, 0 TSRMLS_CC);
      if ( !bc_is_zero(parity TSRMLS_CC) )
       {
         bc_multiply (temp, power, &temp, rscale TSRMLS_CC);
         (void) bc_modulo (temp, mod, &temp, scale TSRMLS_CC);
       }

      bc_multiply (power, power, &power, rscale TSRMLS_CC);
      (void) bc_modulo (power, mod, &power, scale TSRMLS_CC);
    }

  /* Assign the value. */
  bc_free_num (&power);
  bc_free_num (&exponent);
  bc_free_num (result);
  bc_free_num (&parity);
  *result = temp;
  return 0;   /* Everything is OK. */
}

Here is the call graph for this function: