Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2012, 18:30   #1
user1990
Пользователь
 
Регистрация: 13.07.2010
Сообщений: 11
По умолчанию Длинная арифметика и алгоритм евклида

Ребята, помогите разобраться в чем причи7на нестабильной работы данной программы
Код:
class long_{
	public:
		std::vector<unsigned short> chislo;
		bool znak;
		long_(): znak(true), chislo(0){}
		long_(std::vector <unsigned short>  mas,bool p): znak(p), chislo(mas){}
		long_(unsigned int size,bool p): chislo(size), znak(p) {
			int i;
			for(i=0;i<size;i++)
				chislo[i]=0;
		}
		long_(std::vector<unsigned short>::iterator  begin, std::vector<unsigned short>::iterator end,bool p):chislo(begin,end),znak(p){}	
		long_ operator >>(unsigned int c){
			unsigned short g=0, i,j,k,l;
			long_ y=*this;;
			i=c/16;j=c-i*16;
			k=i;l=j;
			while(j>0){
				g = g | (1 << j--);
			}
			g=g/2;
			if(y.chislo.size()>1){
			for(i=y.chislo.size()-i-1;i<0;i--)
			{
				y.chislo[i+k] = y.chislo[i] << l ;
					if(i-1 < 0)
						y.chislo[i+k] = y.chislo[i+k] | (y.chislo[i-1] & g);
			}}else{
				y.chislo[0]=y.chislo[0]<<c;
			}
			return y;
		}
		long_ operator <<(unsigned int c){//деление
			unsigned short g=0, i,j,k,l;
			long_ y=*this;;
			i=c/16;j=c-i*16;
			k =i;l=j;
			while(j>0){
				g = g | (1 << j--);
			}
			g=g/2;
			if(y.chislo.size()>1){
			for(;i<y.chislo.size();i++)
			{
				y.chislo[i-k] = y.chislo[i] >> l ;
					if(i+1 != y.chislo.size())
						y.chislo[i-k] = y.chislo[i-k] | ((y.chislo[i+1] & g)<<(16-l));
			}}else{
				y.chislo[0]=y.chislo[0]>>c;
			}
			while(y.chislo.size()>1 && y.chislo.back()==0)
				y.chislo.pop_back();
			return y;
		}
	static long_  algorithm_euclida(long_  a, long_  b){
	
		long_  x1,y1,x2,y2,x,y,f,d,j;
		
		x1=1;y1=0;x2=0;y2=1;j=1;
		f=a;d=b;
		while(f.chislo[0] % 2==0 && d.chislo[0] % 2==0){
		
			f=f<<1; d=d<<1;	j=j>>1;
		}

		x=f; y=d;

		do{
			while(f.chislo.at(0)%2==0){
	
				f=f<<1;
	
				if(x1.chislo.at(0)% 2==0 && y1.chislo.at(0) %2==0){
				
					x1=x1<<1;y1=y1<<1;
			
				}else{
				
					x1=(x1+y)<<1; y1=(y1-x)<<1;
			
				}
			}

			while(d.chislo.at(0) %2==0){
			
				d=d<<1;
			
				if(x2.chislo.at(0) %2==0 && y2.chislo.at(0) %2==0){
			
					x2=x2<<1;y2=y2<<1;
			
				}else{
				
					x2=(x2+y)<<1; y2=(y2-x)<<1;
			
				}
			}	
	
			if(f>=d){
			
				f=f-d;
			
				x1=x1-x2; y1=y1-y2;
				
			}else{	
	
				d=d-f;
	
				x2=x2-x1; y2=y2-y1;

			}

		}while(f!=0);
	j=j*d;
	x=x2;y=y2;

	return x;
}
		bool operator >=(long_ & c){
			if(znak ^ c.znak){ 
				if(znak)
					return true;
				else	
					return false;
			}
			else{
				
				if(!znak){
					if(chislo.size()<c.chislo.size())
						return true;
					if(chislo.size()>c.chislo.size())
						return false;
					if(c.chislo.size()==chislo.size()){
						for(int i =chislo.size()-1;i>=0;i--)
							if(chislo[i]>c.chislo[i])
								return false;
							else
								if(chislo[i]<c.chislo[i])
									return true;
					}
				}
				else{
					if(chislo.size()<c.chislo.size())
						return false;
					if(chislo.size()>c.chislo.size())
						return true;
					if(c.chislo.size()==chislo.size()){
						for(int i =chislo.size()-1;i>=0;i--)
							if(chislo[i]>c.chislo[i])
								return true;
							else
								if(chislo[i]<c.chislo[i])
									return false;
					}
					
				}
				return true;
			}
		}
		
		
		bool operator !=(unsigned short c){
			if(chislo.size()>1)	
					return true;
				else
					if(chislo[0]!=c)
						return true;
					else
						return false;	
	}

		bool operator !=(long_ & c){
		if(znak && c.znak){ 
	
				if(chislo!=c.chislo)
			
					return true;
				else
					return false;
				
			}
		
			else
				return true;
		}
		bool operator ==(long_ & c){
		if(znak && c.znak){ 
	
				if(chislo==c.chislo)
			
					return true;
				else
					return false;
				
			}
		
			else
				return false;
	
		}

		long_  operator +(long_ & y){
			long_ c;
			std::vector<unsigned short>::iterator j,i;
			unsigned int carry=0,k=0;
			if(znak==y.znak){
				c.znak=znak;
				i=chislo.begin();
				j=y.chislo.begin();
				for(;i!=chislo.end() && j!=y.chislo.end();++i,++j){	
					carry=(*i)+(*j)+carry;					
					c.chislo.push_back(carry & 0xFFFF);
					carry=carry>>16;
					}
			while(i!=chislo.end()){
					carry=(*i++)+carry;
					c.chislo.push_back(carry & 0xFFFF);
					carry=carry>>16;
				}
			while(j!=y.chislo.end()){
					carry=(*j++)+carry;
					c.chislo.push_back(carry & 0xFFFF);
					carry=carry>>16;
				}
			if(carry)
				c.chislo.push_back(carry & 0xFFFF);
			}
			else{
				if(znak){
					y.znak=true;
					c=*this-y;
					y.znak=false;
				}
				else{
					znak=true;
					c=y-(*this);
					znak=false;
				}
			}


		return c;
		
		};
user1990 вне форума Ответить с цитированием
Старый 22.04.2012, 18:30   #2
user1990
Пользователь
 
Регистрация: 13.07.2010
Сообщений: 11
По умолчанию

Код:
long_  operator-(long_ & y){
			long_ c;
			std::vector<unsigned short>::iterator j,i,p,l;
			bool pp=false;
			unsigned int carry=0,k;
			
			if(y.znak ^ znak){
				if(y.znak){
					znak=true;
					pp=true;
				}
				else
					y.znak=true;

				c=*this + y;
				if(pp)
				{
					c.znak=false;
					znak=false;
				}
				else
					y.znak=false;
				}
			else{
				if(*this>=y){
					if(znak){
						i=chislo.begin();
						p=chislo.end();
						j=y.chislo.begin();
						l=y.chislo.end();
					}
					else{
						i=y.chislo.begin();
						p=y.chislo.end();
						j=chislo.begin();
						l=chislo.end();
					}
					c.znak=true;					
				}
				else{
					if(znak){
						i=y.chislo.begin();
						p=y.chislo.end();
						j=chislo.begin();
						l=chislo.end();
					}
					else{
						i=chislo.begin();
						p=chislo.end();
						j=y.chislo.begin();
						l=y.chislo.end();
					}
						c.znak=false;
				}
		for(;i!=p;i++){	
			if(j!=l){	
				if((*i)<(*j)){
					*(i+1)=*(i+1) - 0x1;
					carry= unsigned int(*i | (1 << 16));
					carry=carry - (*j++);
				}else
					carry= (*i) - (*j++);
				 c.chislo.push_back(carry & 0xFFFF);
			}
			else{
				c.chislo.push_back(*i);
			}
		}
	}
			while((k=c.chislo.size()-1)>0 && c.chislo.at(k)==0){
				c.chislo.pop_back();
				k--;
			}
		return c;

	}
		long_ & operator =(unsigned short c){
			if(!chislo.empty())
				chislo.clear();
			chislo.push_back(abs(c));
			if(c<0)
				znak=false;
			else
				znak=true;
			return *this;
		}
		long_ & operator =(long_ & y){
			if(!chislo.empty())
				chislo.clear();
			chislo=y.chislo;
			znak=y.znak;
			return *this;
		};			
		long_ operator *(long_ & y){
			
			long_ c(y.chislo.size() + chislo.size(),true);
			std::vector<unsigned short>::iterator i,j;
			unsigned int carry=0,k=0,p;
						
			for(i=y.chislo.begin();i!=y.chislo.end();i++){
				p=k;
				for(j=chislo.begin();j!=chislo.end();j++){
					carry = (*i) * (*j) + carry + c.chislo[k];
					c.chislo[k++] = carry;
					carry = carry >> 16;
							}
				if(carry) c.chislo[k]=carry;
				k=p+1;
				carry=0;	
						}
			while(c.chislo.back()==0 && c.chislo.size()>1) c.chislo.pop_back();
			return c;
		}
		bool operator ==(unsigned int y){

			if(this->chislo.size()>1) return false;
			else
				if(this->chislo.at(0)!=0) 
					return false;
				else
					return true;
		}
void zero(char * c,unsigned short n){
	while(n--){
		c[n]=0;
	}
}
int main()
{   
	FILE *fp;
	char c[4],symbol;
	long_ * h[4];
	unsigned short i=0,j, k=0;
	std::vector<unsigned short> mas;

	if(fopen_s(&fp,"opyt.txt","r")){
		printf("error\n");
	}

	while(1){
		symbol=fgetc(fp);
		while(symbol!='\n' && symbol!=EOF){
			if(j!=4)
				c[j++]=symbol;
			if(j==4){
				sscanf_s(c,"%x",&i,sizeof(unsigned short));
				mas.push_back(i);
				zero(c,4);
				printf("%d\n",i);
				j=0;
			}
			symbol=fgetc(fp);
			
		}
		if(j!=0){
				sscanf_s(c,"%x",&i,sizeof(unsigned short));
				mas.push_back(i);
				zero(c,4);
				printf("%d\n",i);
				j=0;
		}
		h[k++]=new long_(mas,true);
			mas.clear();
		if(symbol==EOF) break;

	}
	fclose(fp);
	long_ b=long_::algorithm_euclida(*h[2],*h[3]);
    return 0;
}
user1990 вне форума Ответить с цитированием
Старый 22.04.2012, 18:32   #3
user1990
Пользователь
 
Регистрация: 13.07.2010
Сообщений: 11
По умолчанию

ошибка возникает при вызове алгоритма евклида
user1990 вне форума Ответить с цитированием
Старый 23.04.2012, 14:49   #4
user1990
Пользователь
 
Регистрация: 13.07.2010
Сообщений: 11
По умолчанию

окей евклид работает теперь правильно , вопрос в монтгомерри , кто сталкивался откликнетесь
user1990 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длинная арифметика. Leshii Паскаль, Turbo Pascal, PascalABC.NET 4 01.03.2012 11:38
Длинная арифметика nervniy Общие вопросы Delphi 4 19.04.2011 23:18
Длинная арифметика Khelleos Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 20.12.2010 09:08
длинная арифметика Dimarik Общие вопросы C/C++ 1 16.09.2009 12:02