Esempio n. 1
0
void monty_mul_interleaved(z *a, z *b, z *c, z *n)
{

	fp_digit nhat = montyconst.nhat.val[0], u;
	int i,j,t=n->size;
	int szb = abs(b->size);
	fp_digit k;
	z *t1,*t2;
	z s1,s2;

	zInit(&s1);
	zInit(&s2);
	t1 = &s1;
	t2 = &s2;
	zClear(t1);
	zClear(t2);

	for (i=0;i<t;i++)
	{
		u = (t1->val[0] + a->val[i] * b->val[0]) * nhat;	//truncation will provide mod b
		
		/****** short mul of b with ai, simultaneous with addition of A (in t1) ********/
		for (j=t1->size;j<szb;j++)
			t1->val[j] = 0;		//zero any unused words up to size of b, so we can add
		//mul and add up to size of b
		k=0;
		for (j=0;j<szb ;j++)
			spMulAdd(b->val[j],a->val[i],t1->val[j],k,t2->val + j,&k);
		//continue with add if A has more words
		for (;j<t1->size;j++)
			spAdd(t1->val[j],k,t2->val+j,&k);

		//adjust size
		if (t1->size > szb)
			t2->size = t1->size;
		else
			t2->size = szb;

		//account for carry
		if (k)
		{
			t2->val[t2->size]=k;
			t2->size++;
			j++;
		}
		/****** short mul of b with ai, simultaneous with addition of A (in t1) ********/


		/****** short mul of n with u, simultaneous with add. of prev step (in t2) 
		 and with right shift of one word                                       ********/

		for (;j<t;j++)
			t2->val[j] = 0;		//zero any unused words up to size of n, so we can add
		//mul and add up to size of n, store into one word previous
		k=0;
		//needs first mul to get k set right, answer gets shifted to oblivion
		spMulAdd(n->val[0],u,t2->val[0],k,t1->val,&k);
		for (j=1;j<t;j++)
			spMulAdd(n->val[j],u,t2->val[j],k,t1->val + j - 1,&k);
		//continue if t2 is bigger than n
		for (;j<t2->size;j++)
			spAdd(t2->val[j],k,t1->val+j-1,&k);

		//adjust size
		if (t2->size > t)
			t1->size = t2->size - 1;
		else
			t1->size = t - 1;

		//account for carry
		if (k)
		{
			t1->val[t1->size]=k;
			t1->size++;
		}
		/****** short mul of n with u, simultaneous with add. of prev step (in t2) 
		 and with right shift of one word                                       ********/

	}

	//almost done
	if (zCompare(t1,n) >= 0)
		zSub(t1,n,c);
	else
		zCopy(t1,c);

	zFree(&s1);
	zFree(&s2);
	return;
}
Esempio n. 2
0
int
edit_posns (uint32_t * num_ret, SwitchPos ** sp_ret, AppData * a)
{
  MENU *my_menu;
  SwitchPos *sp = *sp_ret;
  uint32_t i, maxx;
  int state = 0;
  ITEM **my_items;
  char **mnu_str;
//      WINDOW * menu_win,*menu_sub;
  uint32_t num_strings;
  int lbl_x, idx = 0;
  uint32_t num = *num_ret;

  message (a,
           "Select and press enter to edit. Use d to delete a position or a to add a new one. Use c to cancel and backspace to exit(and store!). Press p to select a preset configuration.\n");

  while (state >= 0)
  {
    num_strings = num;
    state = 0;
    maxx = getmaxx (stdscr);
    if (num)
    {

      debugMsg ("allocating items\n");
      my_items = (ITEM **) utlCalloc (num_strings + 1, sizeof (ITEM *));
      mnu_str = utlCalloc (num_strings, sizeof (char *));
      for (i = 0; i < num_strings; ++i)
      {
        mnu_str[i] = utlCalloc (20, sizeof (char));
        snprintf (mnu_str[i], 20, "%" PRIu32, i);
        my_items[i] = new_item (mnu_str[i], mnu_str[i]);
        if (NULL == my_items[i])
        {
          if (errno == E_BAD_ARGUMENT)
            errMsg ("badarg i=%" PRIu32 "\n", i);
          if (errno == E_SYSTEM_ERROR)
            errMsg ("new_item: syserr i=%" PRIu32 "\n", i);
        }
      }
      my_items[num_strings] = (ITEM *) NULL;
      my_menu = new_menu ((ITEM **) my_items);
      set_menu_opts (my_menu, O_ONEVALUE | O_NONCYCLIC | O_ROWMAJOR);
      appDataMakeMenuWnd (my_menu);
      lbl_x = 3 + (maxx - 6) / 2 - strlen ("Positions") / 2;
      mvwprintw (menu_win (my_menu), 1, lbl_x, "%s", "Positions");
      post_menu (my_menu);
      debugMsg ("starting menu loop\n");
      wrefresh (menu_win (my_menu));
      while (state == 0)
      {
        int c;
        ITEM *selection;
        c = getch ();
        switch (c)
        {
        case 263:              //ESC
        case K_BACK:           //Backspace
          state = -1;
          break;
        case KEY_DOWN:
          menu_driver (my_menu, REQ_DOWN_ITEM);
          break;
        case KEY_UP:
          menu_driver (my_menu, REQ_UP_ITEM);
          break;
        case KEY_RESIZE:
          //windows need to be resized.. ignore
          break;
        case 'd':
          selection = current_item (my_menu);
          idx = item_index (selection);
          state = 1;
          break;
        case 'a':
          state = 2;
          break;
        case 'c':
          state = 3;
          break;
        case 'p':
          state = 4;
          break;
        case 13:               //enter
          selection = current_item (my_menu);
          idx = item_index (selection);
          state = 5;
          break;
        default:
          break;
        }
        wrefresh (menu_win (my_menu));
      }
      unpost_menu (my_menu);
      appDataDestroyMenuWnd (my_menu);
      free_menu (my_menu);
      for (i = 0; i < num_strings; ++i)
      {
        free_item (my_items[i]);
        utlFAN (mnu_str[i]);
      }
      utlFAN (mnu_str);
      utlFAN (my_items);
    }
    else
    {
      WINDOW *wnd;
      wnd = appDataMakeEmptyWnd ();
      wrefresh (wnd);
      while (state == 0)
      {
        int c;
        c = getch ();
        switch (c)
        {
        case KEY_RESIZE:
          wnd = appDataResizeEmpty (wnd);
          break;
        case 263:              //ESC
        case K_BACK:           //Backspace
          state = -1;
          break;
        case 'a':
          state = 2;
          break;
        case 'c':
          state = 3;
          break;
        case 'p':
          state = 4;
          break;
        default:
          break;
        }
        wrefresh (wnd);
      }
      assert (ERR != delwin (wnd));
    }
    if (state > 0)
    {
      switch (state)
      {
      case 1:                  //del
        spDel (&sp, &num, idx);
        break;
      case 2:                  //add(at the end)
        spAdd (&sp, &num, num);
        break;
      case 3:                  //cancel
        *sp_ret = sp;
        *num_ret = num;
        return 1;
      case 4:                  //preset
        sel_preset (&num, &sp, a);
        break;
      case 5:                  //edit
        edit_pos (sp + idx, a);
        break;
      default:
        break;
      }
    }
  }
  *sp_ret = sp;
  *num_ret = num;
  return 0;
}