diff --git a/compile.sh b/compile.sh new file mode 100644 index 0000000..82857b7 --- /dev/null +++ b/compile.sh @@ -0,0 +1,4 @@ +#!/bin/bash +gcc src/test_t/is_good.c src/test_t/test_t.c src/tools_t/tools_t.c \ + src/permutation_t/permutation_t.c src/set_theoric_t/set_theoric_t.c \ + -I. -o isgood && ./isgood -h -p diff --git a/src/permutation/permutation.c b/src/permutation/permutation.c deleted file mode 100644 index 484002b..0000000 --- a/src/permutation/permutation.c +++ /dev/null @@ -1,105 +0,0 @@ -#include "src/permutation/permutation.h" - -permutation* -create_permutation(size_t sz) -{ - if(sz == 0) return NULL; - permutation *p=malloc(sizeof(permutation)); - p->size = sz; - p->perm = malloc(sz*sizeof(unsigned int)); -} - -/*void -copy_array_unsigned(unsigned int *dst, const unsigned int *src, size_t size) -{ - for(size_t i = 0; i < size ; ++i) - dst[i]=src[i]; -}*/ - -void -assign_permutation(permutation *p, unsigned int *arr) -{ - copy_array_unsigned(p->perm, arr, p->size); -} - -bool -is_permutation_set_theoric(const permutation *p) -{ - if(p==NULL) return false; - size_t size = p->size, j; - unsigned int *count_array_i = calloc(size, sizeof(unsigned int)); - if(count_array_i == NULL) - { - printf("can't allocate count_array_i\n"); - return false; - } - for(size_t i = 0; i < size; ++i) - { - j = p->perm[i]; - if((j >= size) || count_array_i[j]) - { - free(count_array_i); - return false; - } - count_array_i[j]++; - } - return true; -} -/* 2,7,4,1 is a permutation of 1,2,4,7 - *it is equivalent of 1,3,2,0 in set_theoric(4)=0,1,2,3 - this function calculate the permutation equivalent in set_theoric - * */ -permutation * -translate_set_theoric(const permutation *p, permutation *translate_p) -{ - if(p==NULL) return NULL; - size_t size = p->size; - permutation *translate_p = create_permutation(size); - unsigned int *temperm = malloc(size*sizeof(unsigned int)); - unsigned int *tmperm = malloc(size*sizeof(unsigned int)); - copy_array_unsigned_int(tmperm, p->perm, p->size); // copy - qsort(tmperm, size, sizeof(unsigned int), compare_unsigned_int); - // tmperm contain p->perm ordered - - size_t cur=0; - for(size_t i=0; i< size; ++i) - { - for(size_t j=0; jperm[j] == tmperm[i]) - { - bool found = false; - for(size_t c=0; cperm[i]=j; - temperm[cur++]=j; - break; - } - } - } - } - free(tmperm); - free(temperm); - return translate_p; -} - -bool -is_permutation(const permutation *p) -{ - bool ret = is_permutation_set_theoric(p); - if(ret == false) - { - permutation *t_p = translate_set_theoric(p); - ret = is_permutation_set_theoric(t_p); - free(t_p); - } - return ret; -} diff --git a/src/permutation/permutation.cpp b/src/permutation/permutation.cpp deleted file mode 100644 index dcf5f0a..0000000 --- a/src/permutation/permutation.cpp +++ /dev/null @@ -1,292 +0,0 @@ -#include -#include -#include -#include - -//#include "/home/fanasina/progr_/ptens0neD/src/permutation/permutation.h" - -#include "src/permutation/permutation.h" - -int sign(int a) { - if (a < 0) return -1; - return 1; -} - -bool isPermutation(int* perm, setInit se, int sz) { - std::vector tmp; - for (int i = 0; i < sz; i++) { - for (int j = 0; j < sz; j++) { - if (perm[i] == se.setinit[j]) { - if (find(tmp.begin(), tmp.end(), j) == tmp.end()) { - tmp.push_back(j); - break; - } - } - } - } - return tmp.size() == sz; - -} - -int permutation::signature() { - int ss = 1; - for (int i = 0; i < size; i++) { - for (int j = i + 1; j < size; j++) { - ss *= sign(perm[j] - perm[i]);// * sign(j - i); - } - } - return ss; -} - -int signature(int* tab, int sz) { - int ss = 1; - for (int i = 0; i < sz; i++) { - for (int j = i + 1; j < sz; j++) { - ss *= sign(tab[j] - tab[i]) * sign(j - i); - } - } - return ss; -} - -template -void permutation::permute(T* dst, T* src) { - for (int i = 0; i < size;i++) { - dst[i] = src[perm[i]]; - } -} - -template -void permutation::permute(int* dst, int* src); -template -void permutation::permute(float* dst, float* src); - -// complexité sz*(sz+1)/2 -size_t TabToPlaceAlgo(int* tb, int sz) { - int cnt = 0; - int pl; - - int* tPlace = new int[sz]; - - for (int i = sz - 1; i >= 0; i--) { - cnt++; - pl = 0; - for (int j = i + 1; j < sz; j++) { - cnt++; - if (tb[j] < tb[i]) { - pl++; - } - if (pl == tb[i]) break; - } - tPlace[tb[i]] = pl; - - } - size_t q = 0; - for (int i = 0; i < sz;i++) { - cnt++; - //printf("tPlace[%d] == %d et tb[%d] == %d\n", i, tPlace[i], i, tb[i]); - q = (i + 1) * q + tPlace[i]; - } - //printf("algo cnt = %d ", cnt); - return q; -} - -// complexité sz*(sz+1)/2 -size_t TabToPlaceOpt1(int* tb, int sz) { - int cnt = 0; - int mx; - int* tPlace = new int[sz]; - for (int i = sz - 1; i >= 0; i--) { - cnt++; - if (i == sz - 1) { - mx = tb[i]; - tPlace[mx] = 0; - } - else if (mx > tb[i]) { - int pli = 0; // si c est le plus à droite 0 si pas de superieur à lui, on incremente si on trouve plus petit - for (int j = sz - 1; j > i; j--) { - cnt++; - if (tb[i] > tb[j]) { - pli++; - } - else if (tb[i] == tb[j]) { - //return -1; // something wrong - throw "something wrong here, tb[i]==tb[j]"; - } - } - tPlace[tb[i]] = pli; - } - else if (mx < tb[i]) { - mx = tb[i]; - tPlace[mx] = sz - 1 - i; - } - else { - //return -1; // something wrong - throw "something wrong here, tb[i]==mx"; - - } - } - size_t q = 0; - for (int i = 0; i < sz; i++) { - cnt++; - //printf("tab tPlace[%d] == %d et tb[%d] == %d [ q=%d, cnt = %d\n", i, tPlace[i], i, tb[i], q, cnt); - q = (i + 1) * q + tPlace[i]; - } - //printf("Opt cnt = %d ", cnt); - - return q; -} - -// complexité sz*(sz+1) -size_t TabToPlaceNotab(int* tb, int sz) { - int cnt = 0; - int mx = sz - 1; - size_t q = 0; - int pl; - for (int i = 0; i < sz; i++) { - cnt++; - int j; - for (j = 0; j < sz;j++) { - cnt++; - if (tb[j] == i) break; - } - pl = 0; - j++; - for (;j < sz;j++) { - cnt++; - if (tb[j] < i) { - pl++; - } - if (pl == i) break; - } - q = (i + 1) * q + pl; - //q = (sz - tb[i]) * q + pl; - //printf("notab tPlace[tb[%d]] == %d et tb[%d] == %d [ q=%d, cnt = %d\n", i, pl, i, tb[i], q, cnt); - - } - //printf(" notab cnt = %d ", cnt); - - return q; -} - - - - - -//complexité sz*sz/2 -void PlaceToTab(int* tb, size_t pl, int sz) { - int cnt = 0; - size_t a = pl; - int pltbi; - int size = 1; - // s'assurer que tb soit null - for (int i = 0;i < sz;i++) tb[i] = 0; - - for (int i = sz - 1; i >= 0; i--) { - cnt++; - pltbi = a % (i + 1); - a /= (i + 1); - if (i == sz - 1) { - tb[sz - 1 - pltbi] = i; - } - else { - int lt = 0, j = sz - 1; - while (lt < pltbi && j >= 0) { - cnt++; - if (tb[j--] < i) { - lt++; - } - } - while (tb[j] > i) { - cnt++; - j--; - } - tb[j] = i; - - } - } - //printf("cnt PlaceToTab :%d ", cnt); -} - -size_t factorial(int n) { - size_t ret = 1; - for (size_t i = 2; i <= n; i++) { - ret *= i; - } - return ret; -} - -// src1 o src0 = dst; dst(i) = src1(src0(i)) -void compose(int* dst, int* src0, int* src1, int sz) { - for (int i = 0; i < sz; i++) { - dst[i] = src1[src0[i]]; - } -} -// src1 o src0 = dst; dst(i) = src1(src0(i)) -void compose(size_t& rdst, size_t psrc0, size_t psrc1, int sz) { - int dst[sz], src0[sz], src1[sz]; - PlaceToTab(src0, psrc0, sz); - PlaceToTab(src1, psrc1, sz); - for (int i = 0; i < sz; i++) { - dst[i] = src1[src0[i]]; - } - rdst = TabToPlaceOpt1(dst, sz); -} -/* -template -void transform(T* dst, T* src, int* perm, int sz) { - for (int i = 0; i < sz; i++) { - dst[i] = src[perm[i]]; - } -} -template -void transform(T* dst, T* src, size_t pl, int sz) { - int perm[sz]; - PlaceToTab(perm, pl, sz); - for (int i = 0; i < sz; i++) { - dst[i] = src[perm[i]]; - } -} -*/ -void permuteArray(int* dst, int* src, int* perm, int sz) { - for (int i = 0; i < sz; i++) { - dst[i] = src[perm[i]]; - } -} - -void inverseArray(int* dst, int* src, int sz) { - for (int i = 0; i < sz; i++) { - dst[src[i]] = i; - } -} - -// seek?/ seek o src = seek(src)=dst => seek = dst o inv(src) -void permCorrespondance(int* sk, int* dst, int* src, int sz) { - int inv[sz]; - inverseArray(inv, src, sz); - compose(sk, dst, inv, sz); -} - - -// SRC o transf = DST, SRC:{a,b,c,d,g,f} o transf = DST:{g,b,d,f,c,a} -// SRC[0]=a, SRC[1]=b, SRC[2]=c SRC[3]=d SRC[4]=g SRC[5]=f -// DST[0]=g=SRC[4] DST[1]=b=SRC[1] DST[2]=d=SRC[3] DST[3]=f=SRC[5] DST[4]=c=SRC[2] DST[5]=a=SRC[1] -// trans[0]=4 trans[1]=1 trans[2]=3 trans[3]=5 trans[4]=2 trans[5]=0 -// (*cmp) (a,b) = 0 if a==b, -1 if ab -template -void CorrespondacePerm(T* src, T* dst, int* transf, int sz, int (*cmp)(T, T)) { - int tmp[sz]; - std::vector tmpV; - int curt = 0; - for (int i = 0; i < sz; i++) { - for (int j = 0; j < sz; j++) { - if (cmp(dst[i], src[j]) == 0) { - if (std::find(tmpV.begin(), tmpV.end(), j) == tmpV.end()) {// not found - transf[i] = j; - tmpV.push_back(j); - break; - } - } - } - } -} -template void CorrespondacePerm(char* src, char* dst, int* transf, int sz, int (*cmp)(char, char)); \ No newline at end of file diff --git a/src/permutation/permutation.h b/src/permutation/permutation.h deleted file mode 100644 index 5a0c55a..0000000 --- a/src/permutation/permutation.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __PERMUTATION_C_H__ -#define __PERMUTATION_C_H__ - -#include "src/set_theoric/set_theoric.h" - -/* struct of permutation of unsigned int array, not necessarly set_theoric - * - * */ -struct permutation -{ - size_t size; - unsigned int *perm; -}; - -typedef struct permutation permutation; - -permutation * create_permutation(size_t sz); -void assign_permutation(permutation *p, unsigned int *arr); - -bool is_permutation_set_theoric(const permutation *p); - -// more general! need translation and use is_permutation_set_theoric -bool is_permutation(const permutation *p); - -#endif /*__PERMUTATION_C_H__*/ diff --git a/src/permutation/permutation.hpp b/src/permutation/permutation.hpp deleted file mode 100644 index 29861b6..0000000 --- a/src/permutation/permutation.hpp +++ /dev/null @@ -1,99 +0,0 @@ - -#ifndef __PERMUTATION_H__ -#define __PERMUTATION_H__ - -#include - - -struct setInit { - int size; - int* setinit; - setInit(int sz = 1, int beg = 0) { - size = sz; - setinit = new int[sz]; - for (int i = 0; i < sz; i++) setinit[i] = beg + i; - } -}; - -struct permutation { - int size;// type - int rang; //place;//rang; - int* perm; - permutation(int sz, bool b) { - size = sz; - perm = new int[size]; - } - permutation(int sz = 1, int* tb = { 0 }) { - size = sz; - perm = new int[size]; - for (int i = 0; i < size; i++) perm[i] = tb[i]; - } - //int TabToPlace(int* tb , int sz ); - //void PlaceToTab(int* tb , int pl , int sz); - int signature(); - template - void permute(T* dst, T* src); -}; - -bool isPermutation(int* perm, setInit se, int sz); - -int signature(int* tab, int sz); - -// complexité sz*(sz+1)/2 -size_t TabToPlaceAlgo(int* tb, int sz); - -// complexité sz*(sz+1)/2 -size_t TabToPlaceOpt1(int* tb, int sz); - -// complexité sz*(sz+1) -size_t TabToPlaceNotab(int* tb, int sz); - -//complexité sz*sz/2 -void PlaceToTab(int* tb, size_t pl, int sz); - -size_t factorial(int n); - -// src1 o src0 = dst; dst(i) = src1(src0(i)) -void compose(int* dst, int* src0, int* src1, int sz); -// src1 o src0 = dst; dst(i) = src1(src0(i)) -void compose(size_t& rdst, size_t psrc0, size_t psrc1, int sz); - -/*template -void transform(T* dst, T* src, int* perm, int sz); -template -void transform(T* dst, T* src, size_t pl, int sz); - -template -void transform(T* dst, T* src, int* perm, int sz) { - for (int i = 0; i < sz; i++) { - dst[i] = src[perm[i]]; - } -} -template -void transform(T* dst, T* src, size_t pl, int sz) { - int perm[sz]; - PlaceToTab(perm, pl, sz); - for (int i = 0; i < sz; i++) { - dst[i] = src[perm[i]]; - } -}*/ - -void permuteArray(int* dst, int* src, int* perm, int sz); -void inverseArray(int* dst, int* src, int sz); - -// seek?/ seek o src = seek(src)=dst => seek = dst o inv(src) -void permCorrespondance(int* sk, int* dst, int* src, int sz); - -// SRC o transf = DST, SRC:{a,b,c,d,g,f} o transf = DST:{g,b,d,f,c,a} -// SRC[0]=a, SRC[1]=b, SRC[2]=c SRC[3]=d SRC[4]=g SRC[5]=f -// DST[0]=g=SRC[4] DST[1]=b=SRC[1] DST[2]=d=SRC[3] DST[3]=f=SRC[5] DST[4]=c=SRC[2] DST[5]=a=SRC[0] -// trans[0]=4 trans[1]=1 trans[2]=3 trans[3]=5 trans[4]=2 trans[5]=0 -// (*cmp) (a,b) = 0 if a==b, -1 if ab -template -void CorrespondacePerm(T* src, T* dst, int* transf, int sz, int (*cmp)(T, T)); - - - -#endif - -