Пример #1
0
/*-------------------------------------------------------------------------*
 * COMPUTE_PRIME_RANGE                                                     *
 *                                                                         *
 *-------------------------------------------------------------------------*/
static void
Compute_Prime_Range(void)
{
  int i, j;
  Vector vec, nvec, end;

  if (prime_range.vec)
    {
      Free(prime_range.vec);
      Free(not_prime_range.vec);
    }

  prime_range.vec = vec = (Vector) Malloc(pl_vec_size * sizeof(VecWord));
  not_prime_range.vec = nvec = (Vector) Malloc(pl_vec_size * sizeof(VecWord));

  Pl_Vector_Full(vec);
  Vector_Reset_Value(vec, 0);
  Vector_Reset_Value(vec, 1);

  i = 2;
  do
    {
      j = i;
      while ((j += i) <= pl_vec_max_integer)
	Vector_Reset_Value(vec, j);

      j = i;
      i = Pl_Vector_Next_After(vec, i);
    }
  while (i > 0);

  prime_range.extra_cstr = TRUE;
  prime_range.min = 2;
  prime_range.max = j;

  not_prime_range.extra_cstr = TRUE;
  not_prime_range.min = 0;
  not_prime_range.max = (j < pl_vec_max_integer) ? pl_vec_max_integer
    : pl_vec_max_integer - 1;


  end = vec + pl_vec_size;

  do
    {
      *nvec = ~(*vec);
      vec++;
      nvec++;
    }
  while (vec < end);

  prime_vec_size = pl_vec_size;
}
Пример #2
0
/*-------------------------------------------------------------------------*
 * PL_FD_TELL_NOT_VALUE                                                    *
 *                                                                         *
 *-------------------------------------------------------------------------*/
Bool
Pl_Fd_Tell_Not_Value(WamWord *fdv_adr, int n)
{
  Range *r;
  int min, max;
  int propag;

start:

  r = Range(fdv_adr);

  if (!Pl_Range_Test_Value(r, n))
    return TRUE;

  if (Fd_Variable_Is_Ground(fdv_adr))
    {
      if (Extra_Cstr(fdv_adr))
	Pl_Fd_Display_Extra_Cstr(fdv_adr);

      return FALSE;
    }

  min = r->min;
  max = r->max;


  if (Is_Interval(r) && n != min && n != max)
    {
      if (min > pl_vec_max_integer)
	{
	  Pl_Fd_Display_Extra_Cstr(fdv_adr);
	  return FALSE;
	}

      if (min == pl_vec_max_integer)
	{
	  Pl_Fd_Display_Extra_Cstr(fdv_adr);
	  Update_Range_From_Int(fdv_adr, min, propag);
	  All_Propagations(fdv_adr, propag);
	  return TRUE;
	}

      Trail_Range_If_Necessary(fdv_adr);
      Pl_Range_Becomes_Sparse(r);
      Nb_Elem(fdv_adr) = r->max - r->min + 1;
      if (r->extra_cstr)	/* the max has been changed */
	{
	  propag = MASK_EMPTY;
	  Set_Max_Mask(propag);
	  Set_Min_Max_Mask(propag);
	  Set_Dom_Mask(propag);
	  All_Propagations(fdv_adr, propag);
	}
      goto start;
    }


  if (Nb_Elem(fdv_adr) == 2)
    {
      if (n == min)
	min = max;

      Update_Range_From_Int(fdv_adr, min, propag);
      goto do_propag;
    }

  /* here if sparse OR n==min OR n==max */
  Trail_Range_If_Necessary(fdv_adr);

  propag = MASK_EMPTY;
  Set_Dom_Mask(propag);
  if (Is_Sparse(r))
    Vector_Reset_Value(r->vec, n);

  Nb_Elem(fdv_adr)--;

  if (n == min)
    {
      Set_Min_Mask(propag);
      Set_Min_Max_Mask(propag);
      r->min = (Is_Interval(r)) ? n + 1 : Pl_Vector_Next_After(r->vec, n);
      goto do_propag;
    }

  if (n == max)
    {
      Set_Max_Mask(propag);
      Set_Min_Max_Mask(propag);
      r->max = (Is_Interval(r)) ? n - 1 : Pl_Vector_Next_Before(r->vec, n);
      goto do_propag;
    }

do_propag:
  All_Propagations(fdv_adr, propag);

  return TRUE;
}