From 79890b7017ee82f529e7db6477f12afe5fb0e8e8 Mon Sep 17 00:00:00 2001 From: fanasina Date: Fri, 24 Nov 2023 09:52:57 +0100 Subject: [PATCH] change some permutation files --- ypermutation_t/Makefile | 45 ++++--- .../src/permutation_t/permutation_t.c | 125 +++++++++++++++++- .../src/permutation_t/permutation_t.h | 5 +- 3 files changed, 152 insertions(+), 23 deletions(-) diff --git a/ypermutation_t/Makefile b/ypermutation_t/Makefile index ae98de8..372f924 100644 --- a/ypermutation_t/Makefile +++ b/ypermutation_t/Makefile @@ -1,35 +1,35 @@ - - - -NAME_TEST=is_good CC=gcc -ROOT_DIR=$(PWD) -INCLUDE_DIR=$(ROOT_DIR)/src -CFLAGS=-I$(INCLUDE_DIR) -I../include_ytest/include -LDFLAGS=-L$(PWD)/.. -lytest +TOOLDIR=$(PWD)/../ytools_t + +INCLUDE_DIR=$(TOOLDIR)/src +CFLAGS=-I$(INCLUDE_DIR) -I./src #SRC_DIR=$(ROOT_DIR)/src #SRC=$(wildcard */*/*.c) -SRC=$(wildcard **/**/*.c) -OBJ=$(SRC:.c=.o) #HEADS=$(OBJS:.o=.h) -TEST_DIR=$(PWD) -EXECSRC=$(NAME_TEST).c -EXEC=launch_$(NAME_TEST)_m + PERMSRC=src/permutation_t/permutation_t.c PERMSRC_O=$(PERMSRC:.c=.o) + SETTSRC=src/set_theoric_t/set_theoric_t.c SETTSRC_O=$(SETTSRC:.c=.o) -TOOLSRC=../ytools_t/src/tools_t/tools_t.c -TOOLSRC_O=$(TOOLSRC:.c=.o) -LIB_YTEST=$(PWD)/../libytest.so -all: $(EXEC) $(LIB_YTEST) +TOOLSRC_O=$(TOOLDIR)/src/tools_t/tools_t.o +#TOOLSRC=$(TOOLDIR)/src/tools_t/tools_t.c +#TOOLSRC_O=$(TOOLSRC:.c=.o) + +SRC=$(wildcard **/**/*.c) +OBJ=$(SRC:.c=.o) #$(TOOLSRC_O) + +TOPTARGETS := all clean +DEP=$(TOOLDIR) + +$(TOPTARGETS): $(DEP) + +all: $(PERMSRC_O) -$(EXEC): $(EXECSRC) $(OBJ) - $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) $(PERMSRC_O): $(PERMSRC) $(SETTSRC_O) $(CC) -o $@ -c $< $(CFLAGS) @@ -37,8 +37,11 @@ $(PERMSRC_O): $(PERMSRC) $(SETTSRC_O) $(SETTSRC_O) : $(SETTSRC) $(TOOLSRC_O) $(CC) -o $@ -c $< $(CFLAGS) -$(TOOLSRC_O): $(TOOLSRC) - $(CC) -o $@ -c $< $(CFLAGS) +$(DEP): + $(MAKE) -C $@ $(MAKECMDGOALS) + +#$(TOOLSRC_O): $(TOOLSRC) +# $(CC) -o $@ -c $< $(CFLAGS) .PHONY: clean mrproper diff --git a/ypermutation_t/src/permutation_t/permutation_t.c b/ypermutation_t/src/permutation_t/permutation_t.c index 4ed6cdb..e31cbd8 100644 --- a/ypermutation_t/src/permutation_t/permutation_t.c +++ b/ypermutation_t/src/permutation_t/permutation_t.c @@ -83,7 +83,130 @@ int sign(long int a){ return ss;\ }\ \ - + \ +/*complexité sz*sz/2 */\ +size_t TabToPlaceAlgo_##type(const PERMUTATION_##type *p){\ + size_t sz = p->size;\ + PERMUTATION_TYPE_SIZE_T *t_p = TRANSLATE_TO_SET_THEORIC_SIZE_T_##type(p);\ + size_t *tb= t_p->perm;\ + size_t pl;\ + size_t* tPlace = calloc(sz,sizeof(size_t));\ + for (long int i = sz - 1; i >= 0; i--) {\ + pl = 0;\ + for (size_t j = i + 1; j < sz; j++) {\ + if (tb[j] < tb[i]) {\ + pl++;\ + }\ + if (pl == tb[i]) break;\ + }\ + tPlace[tb[i]] = pl;\ + }\ + size_t q = 0;\ + for (size_t i = 0; i < sz;i++) {\ + q = (i + 1) * q + tPlace[i];\ + }\ + return q;\ +}\ +/*complexité sz*sz/2 */\ +size_t TabToPlaceOpt1_##type(const PERMUTATION_##type *p){\ + size_t sz = p->size;\ + PERMUTATION_TYPE_SIZE_T *t_p = TRANSLATE_TO_SET_THEORIC_SIZE_T_##type(p);\ + size_t *tb= t_p->perm;\ + size_t mx;\ + size_t* tPlace = malloc(sz*sizeof(size_t));\ + for (long int i = sz - 1; i >= 0; i--) {\ + if (i == sz - 1) {\ + mx = tb[i];\ + tPlace[mx] = 0;\ + }\ + else if (mx > tb[i]) {\ + size_t pli = 0; /* si c est le plus à droite 0 si pas de superieur à lui, on incremente si on trouve plus petit*/\ + for (size_t j = sz - 1; j > i; j--) {\ + if (tb[i] > tb[j]) {\ + pli++;\ + }\ + else if (tb[i] == tb[j]) {\ + PRINT_DEBUG_("%s\n","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 {\ + PRINT_DEBUG_("%s\n","something wrong here, tb[i]==mx");\ +\ + }\ + }\ + size_t q = 0;\ + for (long int i = 0; i < sz; i++) {\ + q = (i + 1) * q + tPlace[i];\ + }\ + return q;\ +}\ +/* complexité sz*(sz+1)*/\ +size_t TabToPlaceNotab_##type(const PERMUTATION_##type *p){\ + size_t sz = p->size;\ + PERMUTATION_TYPE_SIZE_T *t_p = TRANSLATE_TO_SET_THEORIC_SIZE_T_##type(p);\ + size_t *tb= t_p->perm;\ + size_t mx = sz - 1;\ + size_t q = 0;\ + size_t pl;\ + for (long int i = 0; i < sz; i++) {\ + size_t j;\ + for (j = 0; j < sz;j++) {\ + if (tb[j] == i) break;\ + }\ + pl = 0;\ + j++;\ + for (;j < sz;j++) {\ + if (tb[j] < i) {\ + pl++;\ + }\ + if (pl == i) break;\ + }\ + q = (i + 1) * q + pl;\ + }\ + return q;\ +}\ +/*complexité sz*sz/2 */\ +PERMUTATION_TYPE_SIZE_T * PlaceToTab_##type(PERMUTATION_##type *p, size_t pl){\ + size_t sz = p->size;\ + PERMUTATION_TYPE_SIZE_T *t_p = CREATE_PERMUTATION_TYPE_SIZE_T(sz);\ + size_t *tb= t_p->perm;\ + size_t a = pl;\ + size_t pltbi;\ + size_t size = 1;\ + for (long int i = 0;i < sz;i++) tb[i] = 0;\ +\ + for (long int i = sz - 1; i >= 0; i--) {\ + pltbi = a % (i + 1);\ + a /= (i + 1);\ + if (i == sz - 1) {\ + tb[sz - 1 - pltbi] = i;\ + }\ + else {\ + size_t lt = 0, j = sz - 1;\ + while (lt < pltbi && j >= 0) {\ + if (tb[j--] < i) {\ + lt++;\ + }\ + }\ + while (tb[j] > i) {\ + j--;\ + }\ + tb[j] = i;\ + }\ + }\ + \ + for (long int i = 0;i < sz;i++) p->perm[i] = p->perm[tb[i]];\ + return t_p;\ +}\ +\ + + diff --git a/ypermutation_t/src/permutation_t/permutation_t.h b/ypermutation_t/src/permutation_t/permutation_t.h index 3bfd566..4d52f96 100644 --- a/ypermutation_t/src/permutation_t/permutation_t.h +++ b/ypermutation_t/src/permutation_t/permutation_t.h @@ -21,7 +21,10 @@ PERMUTATION_##type * CREATE_PERMUTATION_##type(size_t size);\ PERMUTATION_TYPE_SIZE_T * TRANSLATE_TO_SET_THEORIC_SIZE_T_##type(const PERMUTATION_##type *p );\ bool IS_PERMUTATION_##type(const PERMUTATION_##type *p );\ - +size_t TabToPlaceAlgo_##type(const PERMUTATION_##type *p);\ +size_t TabToPlaceOpt1_##type(const PERMUTATION_##type *p);\ +size_t TabToPlaceNotab_##type(const PERMUTATION_##type *p);\ +PERMUTATION_TYPE_SIZE_T * PlaceToTab_##type(PERMUTATION_##type *p, size_t pl);\ GENERATE_PERMUTATION(TYPE_SIZE_T) GENERATE_PERMUTATION(TYPE_CHAR)