Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<time.h>
- #include<math.h>
- #include<stdlib.h>
- #include<vector>
- using namespace std;
- typedef long long int typ;
- typedef long double typD;
- typD norm(vector<typ> v){
- typD result=0;
- int i;
- for(i=0;i<v.size();i++){
- result=result+v[i]*v[i];
- }
- result=sqrt(result);
- return result;
- }
- vector<typ> multVS(vector<typ> v1, typ a){
- vector<typ> result;
- int i;
- for (i=0;i<v1.size();i++){
- result.push_back(v1.at(i)*a);
- }
- return result;
- }
- typD multVV(vector<typ> v1, vector<typ> v2){
- typ result=0;;
- int i;
- for (i=0;i<v1.size();i++){
- result=result+v1[i]*v2[i];
- }
- return result;
- }
- vector<typ> addVV(vector<typ> v1, vector<typ> v2){
- vector<typ> result;
- int i;
- for (i=0;i<v1.size();i++){
- result.push_back(v1.at(i)+v2.at(i));
- }
- return result;
- }
- vector<typ> subVV(vector<typ> v1, vector<typ> v2){
- vector<typ> result;
- int i;
- for(i=0;i<v1.size();i++){
- result.push_back((typ)v1[i]-v2[i]);
- }
- return result;
- }
- //////////////////////////////////////////////////////////////////////
- vector< vector<typ> > LLL(vector< vector<typ> > v){
- int i,j,k, kMax=1;
- vector< vector<typ> > vOrt;
- vector< vector<typ> > vR;
- vector<typ> tmp;
- typ up,down,u;
- for(i=0;i<v.size();i++){
- for (j=0;j<v.size();j++){
- tmp.push_back(0);
- }
- vOrt.push_back(tmp);
- vR.push_back(tmp);
- }
- for(i=0;i<v.size();i++){
- for (j=0;j<v.size();j++){
- vR[i][j]=v[i][j];
- }
- }
- int n=v.size();
- vector<typ> B;
- for(i=0;i<v.size();i++) B.push_back(0);
- k=1;
- vOrt.at(0)=v.at(0);
- while(k<=n){
- for(j=0;j<k;j++){
- up=multVV(v.at(k),vOrt.at(j));
- cout<<"up: "<<up<<endl;
- down=pow(norm(vOrt.at(j)),2);
- u=up/down;
- cout<<"u: "<<u<<endl;
- vector<typ> tmpV = multVS(vOrt.at(j),u);
- vR.at(k)=subVV(v.at(k),tmpV);
- cout<<"vR("<<k<<")"<<vR.at(k)[0]<<", "<<vR.at(k)[1]<<", "<<vR.at(k)[2]<<endl;
- }
- typ left=pow(norm(vOrt.at(k)),2);
- up = multVV(v.at(k),vOrt.at(k-1));
- down=pow(norm(vOrt.at(k-1)),2);
- u=up/down;
- typ right1=(3/4)-pow(u,2);
- typ right2=pow(norm(vOrt.at(k-1)),2);
- typ right=right1*right2;
- if(left>=right) k++;
- else{
- swap(v.at(k),v.at(k-1));
- k=max(k-1,2);
- }
- }
- cout<<endl;
- return vR;
- }
- main(){
- vector<typ> a;
- vector<typ> b;
- vector<typ> c;
- a.push_back(1);
- a.push_back(0);
- a.push_back(0);
- b.push_back(4);
- b.push_back(2);
- b.push_back(15);
- c.push_back(0);
- c.push_back(0);
- c.push_back(3);
- vector< vector<typ> > v;
- vector< vector<typ> > vR;
- v.push_back(a);
- v.push_back(b);
- v.push_back(c);
- int i,j;
- for( i=0;i<v.size();i++){
- cout<<"v("<<i<<"): ";
- for( j=0;j<v.size();j++){
- cout<<v[i][j]<<" ";
- }
- cout<<endl;
- }
- vR=LLL(v);
- cout<<vR.size()<<endl;
- //for( i=0;i<v.size();i++){
- // cout<<"vR("<<i<<"): ";
- // for( j=0;j<vR.size();j++){
- // cout<<vR[i][j]<<" ";
- // }
- // cout<<endl;
- //}
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement