Index: testVarieties/Makefile
===================================================================
--- testVarieties/Makefile	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
+++ testVarieties/Makefile	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
@@ -0,0 +1,627 @@
+#############################################################################
+# Makefile for building: testVarieties
+# Generated by qmake (3.0) (Qt 5.5.1)
+# Project:  testVarieties.pro
+# Template: app
+# Command: /home/aaraujo/Qt/5.5/gcc_64/bin/qmake -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug -o Makefile testVarieties.pro
+#############################################################################
+
+MAKEFILE      = Makefile
+
+####### Compiler, tools and options
+
+CC            = gcc
+CXX           = g++
+DEFINES       = -DQT_QML_DEBUG -DQT_CORE_LIB
+CFLAGS        = -pipe -g -Wall -W -D_REENTRANT -fPIC $(DEFINES)
+CXXFLAGS      = -pipe -g -std=c++0x -Wall -W -D_REENTRANT -fPIC $(DEFINES)
+INCPATH       = -I. -I../../../../Qt/5.5/gcc_64/include -I../../../../Qt/5.5/gcc_64/include/QtCore -I. -I../../../../Qt/5.5/gcc_64/mkspecs/linux-g++
+QMAKE         = /home/aaraujo/Qt/5.5/gcc_64/bin/qmake
+DEL_FILE      = rm -f
+CHK_DIR_EXISTS= test -d
+MKDIR         = mkdir -p
+COPY          = cp -f
+COPY_FILE     = cp -f
+COPY_DIR      = cp -f -R
+INSTALL_FILE  = install -m 644 -p
+INSTALL_PROGRAM = install -m 755 -p
+INSTALL_DIR   = cp -f -R
+DEL_FILE      = rm -f
+SYMLINK       = ln -f -s
+DEL_DIR       = rmdir
+MOVE          = mv -f
+TAR           = tar -cf
+COMPRESS      = gzip -9f
+DISTNAME      = testVarieties1.0.0
+DISTDIR = /home/aaraujo/desarrollo/2015/criptosistemas/testVarieties/.tmp/testVarieties1.0.0
+LINK          = g++
+LFLAGS        = -Wl,-rpath,/home/aaraujo/Qt/5.5/gcc_64 -Wl,-rpath,/home/aaraujo/Qt/5.5/gcc_64/lib
+LIBS          = $(SUBLIBS) -L/home/aaraujo/Qt/5.5/gcc_64/lib -lQt5Core -lpthread 
+AR            = ar cqs
+RANLIB        = 
+SED           = sed
+STRIP         = strip
+
+####### Output directory
+
+OBJECTS_DIR   = ./
+
+####### Files
+
+SOURCES       = main.cpp \
+		hash.cpp \
+		polynomial.cpp 
+OBJECTS       = main.o \
+		hash.o \
+		polynomial.o
+DIST          = ../../../../Qt/5.5/gcc_64/mkspecs/features/spec_pre.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/unix.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/linux.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/sanitize.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/gcc-base.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/gcc-base-unix.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/g++-base.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/g++-unix.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/qconfig.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dcollision.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dcollision_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dcore.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dcore_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dinput.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dinput_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dlogic.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dlogic_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dquick.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dquick_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dquickrenderer.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dquickrenderer_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3drenderer.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3drenderer_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_bluetooth.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_bluetooth_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_bootstrap_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_clucene_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_concurrent.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_concurrent_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_core.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_core_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_dbus.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_dbus_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_declarative.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_declarative_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_designer.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_designer_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_designercomponents_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_enginio.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_enginio_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_gui.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_gui_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_help.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_help_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_location.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_location_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_multimedia.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_multimedia_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_multimediawidgets.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_network.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_network_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_nfc.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_nfc_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_opengl.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_opengl_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_openglextensions.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_openglextensions_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_platformsupport_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_positioning.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_positioning_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_printsupport.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_printsupport_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qml.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qml_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qmldevtools_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qmltest.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qmltest_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quick.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quick_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quickparticles_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quickwidgets.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quickwidgets_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_script.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_script_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_scripttools.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_scripttools_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_sensors.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_sensors_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_serialport.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_serialport_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_sql.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_sql_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_svg.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_svg_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_testlib.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_testlib_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_uiplugin.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_uitools.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_uitools_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webchannel.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webchannel_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webengine.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webengine_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webenginecore.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webenginecore_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webenginewidgets.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webenginewidgets_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webkit.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webkit_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webkitwidgets.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webkitwidgets_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_websockets.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_websockets_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webview_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_widgets.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_widgets_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_x11extras.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_x11extras_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xml.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xml_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xmlpatterns.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xmlpatterns_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/qt_functions.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/qt_config.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/linux-g++/qmake.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/spec_post.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/exclusive_builds.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/default_pre.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/resolve_config.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/default_post.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/c++11.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/qml_debug.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/warn_on.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/qt.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/resources.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/moc.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/unix/thread.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/testcase_targets.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/exceptions.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/yacc.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/lex.prf \
+		testVarieties.pro hash.h \
+		polynomial.h \
+		resource.h \
+		types.h main.cpp \
+		hash.cpp \
+		polynomial.cpp
+QMAKE_TARGET  = testVarieties
+DESTDIR       = #avoid trailing-slash linebreak
+TARGET        = testVarieties
+
+
+first: all
+####### Implicit rules
+
+.SUFFIXES: .o .c .cpp .cc .cxx .C
+
+.cpp.o:
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.cc.o:
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.cxx.o:
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.C.o:
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.c.o:
+	$(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
+
+####### Build rules
+
+$(TARGET):  $(OBJECTS)  
+	$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
+
+Makefile: testVarieties.pro ../../../../Qt/5.5/gcc_64/mkspecs/linux-g++/qmake.conf ../../../../Qt/5.5/gcc_64/mkspecs/features/spec_pre.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/unix.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/linux.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/sanitize.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/gcc-base.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/gcc-base-unix.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/g++-base.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/common/g++-unix.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/qconfig.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dcollision.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dcollision_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dcore.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dcore_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dinput.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dinput_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dlogic.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dlogic_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dquick.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dquick_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dquickrenderer.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dquickrenderer_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3drenderer.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3drenderer_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_bluetooth.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_bluetooth_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_bootstrap_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_clucene_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_concurrent.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_concurrent_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_core.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_core_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_dbus.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_dbus_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_declarative.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_declarative_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_designer.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_designer_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_designercomponents_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_enginio.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_enginio_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_gui.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_gui_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_help.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_help_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_location.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_location_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_multimedia.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_multimedia_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_multimediawidgets.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_network.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_network_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_nfc.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_nfc_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_opengl.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_opengl_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_openglextensions.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_openglextensions_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_platformsupport_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_positioning.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_positioning_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_printsupport.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_printsupport_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qml.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qml_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qmldevtools_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qmltest.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qmltest_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quick.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quick_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quickparticles_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quickwidgets.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quickwidgets_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_script.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_script_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_scripttools.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_scripttools_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_sensors.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_sensors_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_serialport.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_serialport_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_sql.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_sql_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_svg.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_svg_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_testlib.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_testlib_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_uiplugin.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_uitools.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_uitools_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webchannel.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webchannel_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webengine.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webengine_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webenginecore.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webenginecore_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webenginewidgets.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webenginewidgets_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webkit.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webkit_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webkitwidgets.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webkitwidgets_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_websockets.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_websockets_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webview_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_widgets.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_widgets_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_x11extras.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_x11extras_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xml.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xml_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xmlpatterns.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xmlpatterns_private.pri \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/qt_functions.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/qt_config.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/linux-g++/qmake.conf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/spec_post.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/exclusive_builds.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/default_pre.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/resolve_config.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/default_post.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/c++11.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/qml_debug.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/warn_on.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/qt.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/resources.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/moc.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/unix/thread.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/testcase_targets.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/exceptions.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/yacc.prf \
+		../../../../Qt/5.5/gcc_64/mkspecs/features/lex.prf \
+		testVarieties.pro \
+		/home/aaraujo/Qt/5.5/gcc_64/lib/libQt5Core.prl
+	$(QMAKE) -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug -o Makefile testVarieties.pro
+../../../../Qt/5.5/gcc_64/mkspecs/features/spec_pre.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/common/unix.conf:
+../../../../Qt/5.5/gcc_64/mkspecs/common/linux.conf:
+../../../../Qt/5.5/gcc_64/mkspecs/common/sanitize.conf:
+../../../../Qt/5.5/gcc_64/mkspecs/common/gcc-base.conf:
+../../../../Qt/5.5/gcc_64/mkspecs/common/gcc-base-unix.conf:
+../../../../Qt/5.5/gcc_64/mkspecs/common/g++-base.conf:
+../../../../Qt/5.5/gcc_64/mkspecs/common/g++-unix.conf:
+../../../../Qt/5.5/gcc_64/mkspecs/qconfig.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dcollision.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dcollision_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dcore.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dcore_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dinput.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dinput_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dlogic.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dlogic_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dquick.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dquick_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dquickrenderer.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3dquickrenderer_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3drenderer.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_3drenderer_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_bluetooth.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_bluetooth_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_bootstrap_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_clucene_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_concurrent.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_concurrent_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_core.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_core_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_dbus.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_dbus_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_declarative.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_declarative_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_designer.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_designer_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_designercomponents_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_enginio.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_enginio_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_gui.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_gui_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_help.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_help_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_location.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_location_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_multimedia.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_multimedia_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_multimediawidgets.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_network.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_network_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_nfc.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_nfc_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_opengl.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_opengl_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_openglextensions.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_openglextensions_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_platformsupport_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_positioning.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_positioning_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_printsupport.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_printsupport_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qml.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qml_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qmldevtools_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qmltest.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qmltest_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quick.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quick_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quickparticles_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quickwidgets.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_quickwidgets_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_script.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_script_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_scripttools.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_scripttools_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_sensors.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_sensors_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_serialport.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_serialport_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_sql.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_sql_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_svg.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_svg_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_testlib.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_testlib_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_uiplugin.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_uitools.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_uitools_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webchannel.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webchannel_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webengine.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webengine_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webenginecore.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webenginecore_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webenginewidgets.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webenginewidgets_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webkit.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webkit_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webkitwidgets.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webkitwidgets_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_websockets.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_websockets_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_webview_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_widgets.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_widgets_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_x11extras.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_x11extras_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xml.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xml_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xmlpatterns.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/modules/qt_lib_xmlpatterns_private.pri:
+../../../../Qt/5.5/gcc_64/mkspecs/features/qt_functions.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/qt_config.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/linux-g++/qmake.conf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/spec_post.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/exclusive_builds.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/default_pre.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/resolve_config.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/default_post.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/c++11.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/qml_debug.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/warn_on.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/qt.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/resources.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/moc.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/unix/thread.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/testcase_targets.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/exceptions.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/yacc.prf:
+../../../../Qt/5.5/gcc_64/mkspecs/features/lex.prf:
+testVarieties.pro:
+/home/aaraujo/Qt/5.5/gcc_64/lib/libQt5Core.prl:
+qmake: FORCE
+	@$(QMAKE) -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug -o Makefile testVarieties.pro
+
+qmake_all: FORCE
+
+
+all: Makefile $(TARGET)
+
+dist: distdir FORCE
+	(cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR)
+
+distdir: FORCE
+	@test -d $(DISTDIR) || mkdir -p $(DISTDIR)
+	$(COPY_FILE) --parents $(DIST) $(DISTDIR)/
+	$(COPY_FILE) --parents hash.h polynomial.h resource.h types.h $(DISTDIR)/
+	$(COPY_FILE) --parents main.cpp hash.cpp polynomial.cpp $(DISTDIR)/
+
+
+clean: compiler_clean 
+	-$(DEL_FILE) $(OBJECTS)
+	-$(DEL_FILE) *~ core *.core
+
+
+distclean: clean 
+	-$(DEL_FILE) $(TARGET) 
+	-$(DEL_FILE) Makefile
+
+
+####### Sub-libraries
+
+mocclean: compiler_moc_header_clean compiler_moc_source_clean
+
+mocables: compiler_moc_header_make_all compiler_moc_source_make_all
+
+check: first
+
+compiler_rcc_make_all:
+compiler_rcc_clean:
+compiler_moc_header_make_all:
+compiler_moc_header_clean:
+compiler_moc_source_make_all:
+compiler_moc_source_clean:
+compiler_yacc_decl_make_all:
+compiler_yacc_decl_clean:
+compiler_yacc_impl_make_all:
+compiler_yacc_impl_clean:
+compiler_lex_make_all:
+compiler_lex_clean:
+compiler_clean: 
+
+####### Compile
+
+main.o: main.cpp ../../../../Qt/5.5/gcc_64/include/QtCore/QCoreApplication \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qcoreapplication.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qglobal.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qconfig.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qfeatures.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qsystemdetection.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qprocessordetection.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qcompilerdetection.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qtypeinfo.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qtypetraits.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qsysinfo.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qlogging.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qflags.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qatomic.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qbasicatomic.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qatomic_bootstrap.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qgenericatomic.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qatomic_cxx11.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qatomic_gcc.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qatomic_msvc.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qatomic_armv7.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qatomic_armv6.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qatomic_armv5.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qatomic_ia64.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qatomic_mips.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qatomic_x86.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qatomic_unix.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qglobalstatic.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qmutex.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qnumeric.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qstring.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qchar.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qbytearray.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qrefcount.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qnamespace.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qarraydata.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qstringbuilder.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qobject.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qobjectdefs.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qobjectdefs_impl.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qlist.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qalgorithms.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qiterator.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qbytearraylist.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qstringlist.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qregexp.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qstringmatcher.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qcoreevent.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qscopedpointer.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qmetatype.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qvarlengtharray.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qcontainerfwd.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qisenum.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qobject_impl.h \
+		../../../../Qt/5.5/gcc_64/include/QtCore/qeventloop.h
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp
+
+hash.o: hash.cpp resource.h \
+		types.h \
+		hash.h
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o hash.o hash.cpp
+
+polynomial.o: polynomial.cpp polynomial.h \
+		hash.h \
+		types.h \
+		resource.h
+	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o polynomial.o polynomial.cpp
+
+####### Install
+
+install:  FORCE
+
+uninstall:  FORCE
+
+FORCE:
+
Index: testVarieties/hash.cpp
===================================================================
--- testVarieties/hash.cpp	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
+++ testVarieties/hash.cpp	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
@@ -0,0 +1,84 @@
+#include <cstdint>
+#include <cstdio>
+#include <cstring>
+#include <ctime>
+#include <fstream>
+#include <utility>
+#include "resource.h"
+#include "types.h"
+#include "hash.h"
+
+using namespace std;
+
+uint64_t lpsbox[8][0x100];
+
+void hash_nm::precalc_mul_table() {
+	for (int i = 0; i < 8; ++i) {
+		for (int j = 0; j < 0x100; ++j){
+			uint64_t t = 0;
+			uint8_t p = sbox[j];
+			for (int k = 0; k < 8; ++k)
+			if (p &(1 << k))
+				t ^= lbox[0x3f - ((i << 3) | k)];
+			lpsbox[i][j] = t;
+		}
+	}
+}
+void lps(block512_t &in) {
+	block512_t res;
+	for (int i = 0; i < 8; ++i){
+		uint64_t t = lpsbox[0][in.x8[i]];
+		for (int k = 1; k < 8; ++k)
+			t ^= lpsbox[k][in.x8[i + k * 8]];
+		res.x64[i] = t;
+	}
+	in = res;
+}
+
+void add512(block512_t &a, const block512_t &b) {
+	uint32_t tmp = 0;
+	for (int i = 0; i < 64; ++i) {
+		tmp = a.x8[i] + b.x8[i] + (tmp >> 8);
+		a.x8[i] = tmp & 0xFF;
+	}
+}
+inline void x(block512_t &a, const block512_t &b) {
+	a.x64[0] ^= b.x64[0]; a.x64[1] ^= b.x64[1]; a.x64[2] ^= b.x64[2]; a.x64[3] ^= b.x64[3];
+	a.x64[4] ^= b.x64[4]; a.x64[5] ^= b.x64[5]; a.x64[6] ^= b.x64[6]; a.x64[7] ^= b.x64[7];
+}
+void g(const block512_t &n, block512_t &h, const block512_t &m) {
+	block512_t res = h;
+	x(res, n);
+	lps(res);
+	block512_t k = res;
+	x(res, m);
+	for (int i = 0; i < 12; ++i) {
+		lps(res);
+		x(k, c[i]);
+		lps(k);
+		x(res, k);
+	}
+	x(h, res);
+	x(h, m);
+}
+block512_t hash_nm::hash(char *buf, size_t size, hash_mode_t mode) {
+	block512_t 	m, h(mode == hm256), n(0), s(0);
+	for (int64_t i = size - 64; i > -1; i -= 64) {
+		memcpy(&m, buf + i, sizeof(m));
+		g(n, h, m);
+		add512(n, value512);
+		add512(s, m);
+	}
+	memset(m.x8, 0, sizeof(m));
+	memcpy(m.x8, buf + size, size % 64);
+	m.x8[size % 64] = 1;
+	g(n, h, m);
+	add512(s, m);
+	memset(m.x8, 0, sizeof(m));
+	m.x64[0] = 8 * (size % 64);
+	add512(n, m);
+	m.x64[0] = 0;
+	g(m, h, n);
+	g(m, h, s);
+	return h;
+}
Index: testVarieties/hash.h
===================================================================
--- testVarieties/hash.h	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
+++ testVarieties/hash.h	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
@@ -0,0 +1,12 @@
+#pragma once
+
+#include <cstdio>
+#include "types.h"
+#include "resource.h"
+
+namespace hash_nm {
+	block512_t hash(char *buf, size_t size, hash_mode_t mode = hm512);
+	void precalc_mul_table();
+
+//	#include "hash.hpp"
+}
Index: testVarieties/in.txt
===================================================================
--- testVarieties/in.txt	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
+++ testVarieties/in.txt	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
@@ -0,0 +1,20 @@
+Esto es un archivo hola mundo.
+total 2684
+-rw-r--r-- 1 aaraujo aaraujo   1847 ene  4 16:05 hash.cpp
+-rw-r--r-- 1 aaraujo aaraujo    215 ene  4 16:05 hash.h
+-rw-r--r-- 1 aaraujo aaraujo  49480 ene  4 16:08 hash.o
+-rw-r--r-- 1 aaraujo aaraujo     31 ene  4 16:13 in.txt
+-rw-r--r-- 1 aaraujo aaraujo   1659 ene  4 16:26 main.cpp
+-rw-r--r-- 1 aaraujo aaraujo 768080 ene  4 16:26 main.o
+-rw-r--r-- 1 aaraujo aaraujo  34945 ene  4 16:08 Makefile
+-rw-r--r-- 1 aaraujo aaraujo  11505 ene  4 16:27 out
+-rw-r--r-- 1 aaraujo aaraujo      0 ene  4 16:27 out2
+-rw-r--r-- 1 aaraujo aaraujo   2886 ene  4 16:09 polinomial.hpp
+-rw-r--r-- 1 aaraujo aaraujo  20219 ene  4 16:06 polynomial.cpp
+-rw-r--r-- 1 aaraujo aaraujo   4647 ene  4 16:06 polynomial.h
+-rw-r--r-- 1 aaraujo aaraujo 970864 ene  4 16:09 polynomial.o
+-rw-r--r-- 1 aaraujo aaraujo   5495 ene  4 16:06 resource.h
+-rwxr-xr-x 1 aaraujo aaraujo 807010 ene  4 16:26 testVarieties
+-rw-r--r-- 1 aaraujo aaraujo    287 ene  4 16:08 testVarieties.pro
+-rw-r--r-- 1 aaraujo aaraujo  23948 ene  4 16:08 testVarieties.pro.user
+-rw-r--r-- 1 aaraujo aaraujo    652 ene  4 16:06 types.h
Index: testVarieties/main.cpp
===================================================================
--- testVarieties/main.cpp	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
+++ testVarieties/main.cpp	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
@@ -0,0 +1,79 @@
+#include <QCoreApplication>
+#include <QTime>
+
+
+#define _CRT_SECURE_NO_WARNINGS
+
+#include <iostream>
+#include <ctime>
+#include "polynomial.h"
+
+
+
+using namespace std;
+using namespace pol;
+
+
+int main(int argc, char *argv[])
+{
+    QCoreApplication a(argc, argv);
+
+    //return a.exec();
+
+    if (argc > 0 && argv) {
+        try {
+            hash_nm::precalc_mul_table();
+
+            FILE *fout = fopen("out", "wb");
+            File in("in.txt", READ);
+
+            pol_t kx = get_rand_pol(KEY_DEG, false);
+            pol_t ky = get_rand_pol(KEY_DEG, false);
+
+            QTime timer;
+            timer.start();
+
+            // generacion de clave?
+            pol3v_t D = get_open_key(kx, ky);
+
+            int runtime = timer.elapsed(); //gets the runtime in ms
+            qDebug(qPrintable("key generation: "+QString::number(runtime)+" ms"));
+
+            timer.start();
+            encrypt(in, fout, D);
+            runtime = timer.elapsed(); //gets the runtime in ms
+            qDebug(qPrintable("encryption duration: "+QString::number(runtime)+" ms"));
+
+            fclose(fout);
+            in.~File();
+
+            FILE *fin = fopen("out", "rb");
+            File out("out2", WRITE);
+
+            timer.start();
+            decrypt(fin, out, kx, ky);
+            runtime = timer.elapsed(); //gets the runtime in ms
+            qDebug(qPrintable("decryption duration: "+QString::number(runtime)+" ms"));
+
+            fclose(fin);
+            out.close();
+
+        }
+        catch (char *str) {
+
+            printf("exception");
+
+            cout << str << endl;
+
+            qDebug("catch");
+
+            scanf("\n");
+        }
+    }
+
+
+
+    qDebug("salida.");
+
+    return 0;
+}
Index: testVarieties/out
===================================================================
--- testVarieties/out	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
+++ testVarieties/out	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
@@ -0,0 +1,183 @@
+±iËàÑZ*Þ·
+áP¿±üZr¥â	JÜÆT,cÒµ;Kÿõ
+º
+pÊ9áüq	ØÞÆçQ!m+_b88
+0 0 24 972467909264721061 760965297849727482 346817863947001119 577958094241452071 2233910165511837813 750181475550816871 234424877375860498 247148342061942312 1049709570752524627 373685309741956815 886964333935544836 650449083517308103 2181018017440942974 1247979976358626937 66450566462402157 1684965907130332546 687919073214291336 988687216762698248 1137247072607722104 1846310714663946965 923785741789121593 169259716238465548 513088370713633252 1950356879502766702 1823804281934886847 
+1 0 21 2107458785106123241 1185254880904093036 823431738999072106 786533216493071195 1561960726185356030 1778140636257804280 934678183056865643 498478074630271049 135512372506892509 443357030128955650 150540712306356586 1105143403337247228 517503665907901183 1915484033220021485 1677131408756405746 640688779072265487 1459859984456575548 1258000879645337416 1623102485630696249 809910097581157085 858404037853626435 1966782574100200195 
+0 1 21 1208782258601669813 171360587940350126 331031237424670273 1118966791441091197 2292112600444778982 161470518837183637 1920370150713468795 1199130097837773296 1312333392671865219 2152954290180715574 81339882373888856 2018990870564626464 726280110703541737 186484411004274277 2016734285520825024 1146031884773344708 891951217266740961 1485683626395359899 1593649760650763344 430562371902355665 148813986976687579 1617353246166977632 
+1 1 24 811796286046792846 1425124059137374714 259087190886544278 823552785257297451 1242711571978616887 185524611027458078 403712188953515619 2028220764354889297 1469886174373269367 1362395745629497617 2045650491287814377 65099070611406017 1682846323068519307 613729521889398923 142753467324006447 1081126499414814286 604987617929277049 594691180163786613 990515315955063821 2134674643108684402 509515722294135773 108919768303962024 1171250459642987533 545914192728741331 399464668273415567 
+2 1 21 1723907782965901259 1908486593763630756 735663787841019283 407789998558394285 1731723948534025128 1196036529648974321 1774356830669292181 992588464023065948 72219932246280153 1853206886689963087 1563300053346953117 2177554878054948457 850881400389974738 787791463955223798 114842126206849349 59630509045082144 920540302260403149 724770785430284062 733514110503245852 493313616509645102 1847601746895287746 2049437985221038103 
+1 2 21 475421953982412375 1205637852144964726 2101312550344582100 860653087972395350 13045474043803090 5172137682727255 1005803482040646669 2266994517973831826 1830035958016987565 1834473151237805511 1627046533128960273 1471614189736139439 751547368457892163 160934651619084219 1226002305315999755 882742417556417341 1226177031332003511 716338236531232192 1101340275928285502 2258535088267220788 746292968519305878 2287749381433561502 
+2 2 24 1215467828470731975 1347813956449924812 2291899522837878237 266572144674655722 45575866555636908 1576638945970822411 173051134529136014 138085462006053996 208196698782478299 2156608758904654375 1426597874767913118 1045610844546261650 943834294235832466 1315665645150705860 2088364513791129982 2237564819994109687 881711701302234341 1137173523551518677 18197345325202253 99503561245447801 1988327294216755665 1547965060676242317 600186359651796771 294191666410211716 1965903497618379951 
+3 2 21 49090389316790230 1862310530556209141 1164440071027197618 1215264282353845975 2218753892205727652 2172698293824655272 1414862899298947869 803392715505304742 664219903630803308 740993760162752987 677662923566046804 1495752526123819700 86774278305649075 1386938807269311141 985207767649683807 713162731488759637 330877342870740655 2186571956983877730 393372991299668240 1548131537359053300 490976002905117641 2092216440506725589 
+2 3 21 2242866967993856464 1501044622568805319 925033393274750523 49810772871801409 1329810573025756905 1906629327814991434 1912421968952568991 1385745159961381661 1503821021037180172 1514687561567944306 1801530050231156226 1146068729951867621 2068116300355660665 2286747254768098768 1930835680047169006 309607484802773939 2266464612629274599 700802869804129775 421117719025863277 414320241644686922 734803120407099578 181550249137933132 
+3 3 24 1647886132445021821 154984466987765441 1586003632223524372 1493942229464039742 115528079446403982 1456665584253217885 1823178977033301403 1245695144136205510 145520091476898401 2259520094039344679 636473027594998377 1040547862840875250 2207506299093899138 29001335886238459 138514126336175256 80387500456310876 506244783502673512 516001984929605678 932527595821359252 458626292459383794 2112156961620715718 485775427074297488 1735770848345216769 1382337070161051513 1813087533506474381 
+4 3 21 1907998063696637858 973667915511607739 1047511570636820794 2107507231349835779 2105561264306231766 675076467359057236 1980501077649518077 1567263514187119690 6075356326345063 1507411182810213252 1666672922441664921 2091456275371915108 2085917233065010518 165577638091997896 683230707122430714 1813593325083053326 105697817833363480 1166516049398971261 1524810517702721305 1392994782800035436 36143169376613242 1482546571519928191 
+3 4 21 646971176371226514 481016729330645924 2057656615374089798 1750690245435781468 1269721082451120932 776563250265443430 907016586035722804 64265192993509371 1359376896247504666 1578069597345749065 1773772336921005347 614250498433424207 962914469772562799 400782691641981073 720436139670499660 2139260302195989343 2075919936082149809 1106122603147620310 1449983092953510554 226418099759622211 574248141233495069 1690160558749186741 
+4 4 24 621605867962238450 373487518561140214 591669627238725552 1910574673897055069 231520076804622071 1363935938038901504 1667833183407878131 1485978336660481010 2293400300188844445 1641003845696288913 2276652752742801138 269271639070226639 314002709898312961 290839310506980451 2068276485766261998 833729682074898379 1652061729776520268 878310659681701611 484386536108674120 271501619190165571 1904583279596791743 183850750729650690 1078092076442026409 870911728760435340 896346633190834632 
+5 4 21 188824118275733699 1405585810035182721 863998747485132557 1359250518431856949 620176384010350522 720359561400894633 1822610857603706432 123671353040084287 293615032529913643 1716808318328199323 1663589467276058911 710337841696095427 31950216507782334 1631567326491573793 61891694091545983 1665142247083071788 1237215958593858728 414599900756225557 537602494461308205 2228729472817671276 468228383527290434 486035028934537385 
+4 5 21 1367942578154036075 819961746156399120 626580245974076792 1034695892309910178 76500984059736066 1804600533667525400 2233984097716645383 1306453288058169087 1790088972445175040 1891734232855427948 760591158338886143 1197065269089628977 1111472326047372318 1794013684584477468 1218505321345943622 174995809342407393 873228388360931497 1625438349875558008 389630759369621895 2026007497373033147 549485830604662995 2001596223331846385 
+5 5 24 249032425242100360 415395311018664474 2014974306318724705 1362888350675019597 1821108135072361541 2050132334585859992 142728646832794755 2194942644270171555 158732556507589468 1273444836018914651 431704028765969652 552132889654620020 1226190555324316597 1663898239216250831 565609960838463335 2027037918971785470 1806776435568778486 317741157758626801 1359522730195341556 2120201165200344609 1037154456076575511 608971042224753201 204755532135475735 1404482065535908973 1462804195438542701 
+6 5 21 1737536677173561300 1269947694954555741 1830374638455729936 830642020958458264 194697543402579039 116520320196624592 1534019353729175867 1328746573000187337 2013603233149753464 2148299309627883673 1031563291146858784 302794245695933936 317270518419629739 502637082259771366 81807846340851032 846157651816595754 66349769040970684 1883760044770084170 715620545799578153 1224191003928461403 1572384374275370130 1219111028909597339 
+5 6 21 1686028346173803838 1680820584121424044 943800589959812264 282443658406227628 1541026738161498988 2203281936778789045 1515604846985323735 1497868322416149293 220825445765864456 1427126888278722758 558024578709815407 248412996563655088 1977869933280844293 209245476891452590 1329302051523547744 1044318184877534515 439747318527352849 1411768062334852550 2144388755207174076 732095822839445043 1857103956981014481 951365660926774691 
+6 6 24 2215144869857515023 257830120011051253 241004543811273738 1711334465085914414 1465213666481418823 2228149691339129170 34327034748112564 1736885120706770688 1584339307822613792 231213455038763329 232660577528230620 942933750889867491 24509846195969583 1204047128078292640 1025034952779961159 1544258469737179863 305409448988677759 2301554489245492937 1075199703909855659 405206396064068057 714640642522202847 1753536980146064363 1943641578702826783 935919477072280204 1643275395823131583 
+7 6 21 677990974085227966 756550662941787877 1127017727578207566 2298494451548835311 1015577606228367439 1171573251867573327 537888861545862315 1568993685464361674 676573696541082502 1859654628999179440 1881533721161841444 1714958138617241314 1744201341943409903 2141302540096687177 343808764259321690 1861703977382132147 960733186691621200 377173495546938222 185889691093522539 1595637966931691027 367466185605795133 714011585752305407 
+6 7 21 995031086868274591 1325378627773177659 102392394140218000 1400782699121819516 2040113759877540567 569049807916187812 2011826009915949310 1588467605119891768 411444013055942986 1087257821173009726 1125680891832208577 927663616682155131 1483245053655538822 222576572714637903 2289494150051025576 1332711562960917096 1210156224501086663 2037432888157295300 1529816002271001029 72205034910675914 1069183402239395256 1994784526245198100 
+7 7 24 1136300927958084187 263139651480407270 1686327483090409686 447714148798539465 396033025187688845 2031886346277426716 432336753652054209 559152625741216625 62286670300554310 226292480488936179 850844130982811049 1754452176180198293 1588199506393343572 1051356335200401979 2204928030038110901 303090444185069523 228183735365432715 2281835817659450489 581251254626906816 8444891110468444 789885264255836253 2019010469178947582 2007772971493307040 1011307683509792910 1792955918051569048 
+8 7 21 88568934120877711 128866401862565979 1251841025588821817 1884422121274855339 150256177989554924 1941660961652436002 702454407296426970 1098891574866187266 235251607368618410 1922784439112342185 1692878463363135211 1286437267752196573 1837193359546757672 83900885688554096 926986887993844385 443978929374623249 2231077630757435715 612307994973772712 1212918586808215195 1728751274102721305 1762039353760794438 1973464157370836862 
+7 8 21 831171090552706529 1176557905651345957 108461909741073427 378995827851126895 2219938425753412033 1915970854775175511 1250012287512930658 744293590127036700 1696912501144431401 396286203439571163 2138873158502726218 1792034638008203516 1764197316199901060 1056525621857012995 2080015663956013974 1626965671957290284 1517709079711356837 1540806945149970969 2217381402396571998 1611822711866758980 2061778116933047432 2224950452036547239 
+8 8 24 2118130160803106344 376135365227486234 993230237764209875 1403007014259943139 1882334499640408496 823453390820965090 894590920653284108 2254454837616735300 1153824644472335655 812523183921227814 1642597104771587489 454789375606482293 2113328657496024678 1591750024182990483 687463781026632673 2003670595598075625 669610442797268269 50079439729189514 1815883614596509180 1770700047738756642 1936616625355007284 573780622729503932 509121113152553923 925779336261311719 1254604028030724514 
+9 8 21 268877743694287910 1387717633658994755 1336880887272002081 717022167451169169 723345170550080215 2089233892563153086 300625061328728136 1298998906909556414 448680207693173909 1663729187599743565 930360464566935475 676478690883577017 557325271996241 1295289022348066914 1193059343552352085 226699661415974314 2288448755419042687 2299174496274295844 156560572204869024 19256205196927988 1925580686084544520 808445112720013917 
+8 9 21 1865348548087322839 236408154807779349 829226240427856683 1232302979540725104 720660799524892038 486095711823947814 632971799237280129 894457412314484928 1743872047389786246 1422944049132572414 1854670565941464328 2008373733527444798 1480672826013471090 1377448117533058511 431167566276363739 711704194264911356 56293093213326962 854249007727861811 1122813260777100311 808748304652105770 1740756808388698577 1473062770360883071 
+9 9 24 280391451267801704 2246728747442530490 1219960850655564876 1232178822491327850 1362908233139510023 1732630564117330316 2039878224884679723 837632098901094327 302471308727408687 260064517089672016 2124448956435470900 1361559995824897275 548936791873863945 2259870396014899553 1326532408200655398 946973103646294344 585965625175380256 1396848531127428490 82161477600500565 1440769131801257031 951243635235718176 1506498140757869154 1058494566334757440 43167147689575929 1939156500237165836 
+10 9 21 1139916898174583576 1490016811245995309 688573454719229334 1691177682265282139 105057547620549061 1116646163813713530 800571579515252623 1626245020620019386 1378296164802754003 126288053573373213 1206214240813993949 1517146103084779687 873474116195038753 707337633807693657 2020353452328759364 1812577304812629286 1171416919889894690 1599463332551866780 1260273055282182105 596506993966380551 593661308673175176 40444155660603189 
+9 10 21 220627335182681488 2064278284928507045 435327322334997069 369880252834302536 1912491698094729210 1033233021619170391 1728893643328515282 422140587667257904 1028408851989760658 1582705148530547486 934711189314205899 1092561712926089222 344167935134165349 159790742875325008 357229230746303987 1981266059046963689 102724714786302395 124205425856732169 1280584232093115549 1457543940914979223 1836142565591181865 1421466002886376650 
+10 10 24 259201053906991329 376944496981413880 2198044392602815719 1323468944060887951 1983804977030114783 860120834766579537 2112279828936662273 1094952236176724483 1732863544638987459 1274897527183368120 2227163832369275724 500407392158392083 1082893720809617772 1413460315608044137 1070930314102859278 814213901856839727 674241641892440017 344688707499192594 1534644993483370995 1309161836126403696 1551846763175195774 2193567792307496735 363043052367219182 157788211009814175 1794818414145016594 
+11 10 21 891019426390823054 2275436204299923081 239782803611966824 246037481577817355 1347409874589987687 958591008626158873 2298137702648220780 1743063366046383062 1924502907895353990 682455659749804883 1843971066719458977 1307716546429063121 1412813198667935915 1463302041362121840 2284325558341608113 802138152597068803 21033430597113726 1827723968844959986 80482261101164934 1621167733978616034 2071050823998644796 1055963128898201727 
+10 11 21 1080811806444752299 210918354112738025 1905821472788743208 1479854801503103571 491759020719223330 2161618950700730771 176519838893486594 828915566755996639 457417267397800535 1647093475686341666 255523825292408534 1185752826747844964 488120895831846642 702954682494818393 140260394653789104 2290768232344069766 1707514747323272417 498284194867043895 653046951168225339 295841002339318444 1660976455720862244 1890902191459249840 
+11 11 24 1713329252054447188 1391676046609732078 1865065983021076695 353558886686286395 1012836191751488671 1360724232659014773 1926163517591249801 1899891122350585968 1579432778497391728 1818720411924976433 177691574246392324 808819980072629398 501286542952232455 1856677172782189768 475435930130576026 191626978135129124 1605246778149642783 2286770284091642596 1758993365828379357 2021214898762014512 319871571692057593 1605015552273297864 1427216417117255179 1949877305583174217 2022118025000369457 
+12 11 21 457503761331279000 1001084100176527783 422105478557977510 1630823251315174161 2153865031512626392 283994866712452252 1582070105141500770 1368981986992261900 1481771282967700645 1997379908873662181 1605924193230027493 1022063984578596960 284689600543283366 2090431072892940424 982601415870974644 53217522680846387 1379038036584220951 200020410654535961 1464203734176455083 1360971977407194282 2079687294914389977 122517962514573376 
+11 12 21 1822436410301179948 2233280909315798223 294649135823713414 153021964802270406 246907525437039798 2239517177272881720 1267298716929356366 2119824604471637379 1310248238233665144 154267755687905455 864857259445019504 436038521028460116 2266977242892368789 1957778319927943737 2153733548234145578 2045257037102961658 1634634562626419441 1565398290132173798 1572720652699601996 630815064718741652 1084296872206771672 2025939952632591155 
+12 12 24 985466445014251206 2280408970834257239 1581195913918093058 1175243100073765522 6002594079946900 549090318867484912 848340689191825011 1220925084607573638 572255253756515092 1720715315205353432 145354893221312637 2034987249655931797 729980281349842550 1084458040572122535 206066045431294595 1433162311105961987 1469807170314266640 19118296681504978 1651396186822555109 1522243259731098019 1038562180613860872 1927011681174594314 1046376982298907444 887119777074604768 206026001773438201 
+13 12 21 358671166632392669 1802647768727732419 2039559937330048011 2115136344376981065 1028093140544170885 283492357770000013 1692570967008417259 576378058985738681 398040279347762246 489362555212564631 456366913523661130 2003540804437951741 1175711749504206188 789754717210151307 2015815889614871059 1538826516142617687 781522765489497456 1182524313155862610 2092934012911087224 1540891301309386100 1510727203312882854 1332933357903847603 
+12 13 21 1257758506438024284 77462475333269697 981687081218390184 2183726278285120007 2021013928848122979 2283149845355454866 1277478920719336614 2281027732638822290 797782308202930969 467026461251361417 541724094512116082 541500706217202740 247968459839534903 580125002081249918 382474784302578617 1075367758625115005 1516287327669978877 299869312973658921 1154327334264306310 1700596768209254251 791329921741005422 353967468413887585 
+13 13 24 691073871035251633 993734943178461248 981412595090430661 2234919215769856856 2197798223642533879 3242602638124354 1185448071431009411 2107541523947122230 987941570873143590 2058738644466972689 92665440410931793 106203719850443179 753240509532174584 1734442370599025268 2284947698195954017 419837132021468269 510229403478679337 1433121125357932024 722819088238160558 1866191926251365604 741107590564847705 678906481884244546 1622773087312418829 861335206533953860 2299048353420492930 
+14 13 21 937550824274113408 1052762449078057196 2060154687044138456 201920393270771281 1393123132776567351 122053056118119856 879290011602326593 22801028386545201 168347188281250164 666613520732550900 1657963047496056176 1762174620235185041 1748988907541707554 1887681341172700884 686036930102931891 1732590651784022979 545950713078861677 1192149574529554787 87846490866543258 1006358545995205070 160558302916404892 443558987854574577 
+13 14 21 1514338876399588490 2245197501061712847 259121507443612975 1605726865768358865 866468141127626983 1704104351139722651 403937260192064003 117792666715611485 888501207909027176 2161864146673601941 1343148547015082125 1567350175761780286 1034971257957482526 52724063291690309 1196794526339049018 186981987462887598 1837578639654936759 1620899840522469143 1014470456703230436 301965498639255036 2239608383139120678 2263948240444702513 
+14 14 24 1056397533956034202 453384202286618143 1836678804272108565 1187059470144718295 895525580801930195 303920064463248204 1268810501908452175 883565993234158426 864019811960932524 944613167371644044 1903287349050280465 1894599775668230188 2195351384385515655 585128844132592103 57484353237259353 1482488380843310263 1414547673739123151 576044806818055183 2105716088427800228 1966775393651021039 598189026777566217 530210911036038888 898255767263387758 2044887173425502648 1677832808307673077 
+15 14 21 251780953717584991 2028645073235579237 2304335247014619917 973976258359757436 401467652315805260 1422985737473471088 1773708319280901613 936058003394944398 783114306110894120 1268308554507683867 1245490383028171153 885286519817908458 2008149373844555081 1313767791995250630 827280276213631144 2127376809952711041 1482970617382058914 1986589766773391977 298253332172540519 1993964750095397718 69932338691391534 1307513169551999324 
+14 15 21 2115837464199724573 579616588112594136 2283692950673911574 645302059174960458 778173765167873322 865053850389000972 319430307797479733 454330646013979400 1435577210156378846 2197334312924798065 114064537365147012 257791741483190648 1734043655178214459 2231777123207876589 1961933845503771859 1947771756601137192 911326710720122297 394658992446195927 1668641634497198402 462602228014867403 1775920052269704005 287315253765093479 
+15 15 24 1852459707032793508 1929370578718924613 855173024143269707 1473148798380932511 2294630483234052846 929545068185440652 1804977528939132914 914170329585192436 2086322085432740961 1630283009991178606 1933755880513082652 1270133557450552170 1168448541514947993 2201830695244768910 1899513028105461529 168522884539400030 652778932519407258 886425389620377172 1798228154614166895 846379945660014571 1479678576933121995 302842374474737812 1906753594649627453 979851886990628670 781588846992982914 
+16 15 21 2098859868148862973 980670041868948951 1012497327397015618 1066417483359526738 2170641413014043104 1844250822755054284 388399992935987392 158558436409412464 304385137937644599 1001290653821287209 712026104883250745 2152967110918598591 1471255271682107660 572467488349966950 2228683135382317668 1357862548829483772 561183284344133097 223788054534595959 1422299833375189805 612874573463517540 1207331923082328659 1091601777627253471 
+15 16 21 1553618234991763491 1095730403960782353 27013837846094239 2033992462229007022 1285238060933314465 2214377859886324198 1463093573318111785 1433620289446991160 948683141710303821 1885473092940979097 1997594258554910269 821530253737672960 1390715463427107257 1261564892702691275 1148015944869781199 1114668484411983008 1403510506370054908 1945242328840817671 291561612275828582 415347857207987196 1740155432274421342 1395707669587230054 
+16 16 24 1864694990306552412 1378524875690916993 205885680298345774 401264550689455415 1231781929901894845 2043921575620545133 205925904539673149 995927349746113937 643050136132740296 1751386210992168983 808012165183271095 1329248957914795219 2195955180015979649 716971285010252306 787208639146155170 627476689830107295 1945045018602389432 594893594888224536 1169028985284316142 1308129327418296796 885270017443510260 774329987057443070 1293120752103346518 412942510098889071 903003533935480780 
+17 16 21 1584461238992390318 500950621210021417 981777717178638489 273382035012448713 1067475316628666285 83456884021202602 38246830043870158 503521952634215125 1432675514597450718 434717346408767728 2007125292502259562 142382182802045599 109574100849454038 920642188812501847 1564249534090603994 915708650146868215 856697586176453982 1000456590689919603 1307418897386766939 522827212870019101 72433399539086296 1137594419606246687 
+16 17 21 1107775327482743815 1139606686857147870 2025987071579598798 1366276254705402812 138571288927628528 1855367020871923706 1589319224569528923 1219752433846083853 1799203382862219705 1507052572698973932 1309455563075050770 1962590511968030156 859078246399201947 169868171242106558 1335105846921022507 894526594649809026 1667426231341814298 471248649434995358 1557881255977280526 574864278624932374 1973595324166561748 2189984440658399159 
+17 17 24 1639130264797999116 1258533432482005943 1779818406611572416 717085990993854325 1748746423051388732 1768066950819131478 506707040526271099 1918702615784178974 1768632531904277367 1239900365450767017 214962147860176127 1738181498274413449 1059833452184106550 729574240982865112 476454844339341564 614962745686592733 656827099257193447 478980922402680994 1457334425322257107 1851972421098314967 500601783276984298 865670905926785902 2112976289168603265 268178713018434280 41177013975989459 
+18 17 21 1951446335670342142 2028112293692615879 1313350892819066395 114201933659776350 1589406465266442948 138655222775909410 2275806127875848432 397877188859231759 1591199134991610927 175228657028252830 513865769831967856 1387122412216691669 1344064746341161139 120901467912289383 1919651840594830860 1988609225051719022 459059306837742314 2301692943904489148 281910977214204520 1272723525881680351 1702290313758211366 1573643223950294423 
+17 18 21 269775397897998904 325416399858196489 245768520130909733 1886732974111403339 1865408747259930603 933661377579398687 180866964929639622 1160426215538427146 201444777111056968 1492285455066352617 532887770773655808 2269814360029100562 544871801010813394 2003225077145079931 393149518305772957 374632267759318238 400930170061465656 2229764643275554263 1772128138727803099 1445651530259500135 42396150008513571 2026593423371700087 
+18 18 24 2040395981259412694 2237890179124504422 1508191913384633516 233775928911167913 264737093054174966 488059008229663213 719972973870499023 591668690433464429 562643827951080045 1474032552665462032 1070284134897448019 718644313340221750 24828798943756530 659050728901199757 1043229883097812327 1480031399196687550 2124139287758998137 1025223980890510752 186820087414817826 1071146076783767793 1254404777100134681 1781987993053289689 930988518931829032 1378319504931554191 2252825129342943729 
+19 18 21 608992846781551831 1237386561371261789 1001606203311617987 1498298761088715369 1543554857756133924 685623145205422664 525651038957511376 1154534154627459616 919210333115971119 672715332259416570 992348450053762348 1620336319885715057 372572062539964551 169761525114253804 2138177758451887776 274775315953774856 966153420366322300 411703572140819873 352291830481492098 381213421504795340 1741953744950028121 980758633379969852 
+18 19 21 1748278611458421433 196413401294820022 233358717318479171 2255247742654143214 1804035096116830896 2191651162929371237 1357118449174430438 1227135310046825668 367940522834827965 681920937385225866 268915143862640728 1132397758147460753 211065852787648451 1893286758562292070 611353139267832538 406132448831578188 1418069942163223754 953069159320643010 2100226183444292986 904829302521937076 944254913203278046 1769039812801782275 
+19 19 24 1149237782796966275 1128889239729637673 2112150325358027074 496265178291500517 81894254350990668 1569675341711864496 1636448913297565816 516220162912657500 2117324779781034948 2199754776003109010 1386957405888319692 1070251258752902601 420172719831225802 1674017442266041908 2278452349098045942 2218699091564866035 1774190869305450556 1648033470311965644 1163927858448918783 1357731943982705196 1778347221638351051 257469302475287838 1630738551172323877 31596273774144029 473003547985146034 
+20 19 21 1288593540215944736 1657878198839145975 1962731842029494420 2028262831769597863 1579105276883470549 2109301769904422522 1638414512623006682 742536390713541163 1634644124748087066 169206344547022285 698033705054581481 966794319810801548 697377153480191522 184391001114480970 2055691828257314569 96372207841773646 1777704792774939082 88871331453930603 525242857420348427 1413616252659802238 1007589531879717908 448392776618001342 
+19 20 21 595373703854664007 1178884582184424578 305543030947281701 213259357184270226 143200392337788747 1966579347596685505 1925067057149354198 836815290141749475 968968780927693041 115011149710820221 1894189530449268791 2028059232306440311 1835814070612519463 245468222135985226 941235799988600856 236174746283612193 337607055008654543 1252261650089301362 8269609231231774 949577438179554524 2138514407783668530 1175716096409949990 
+20 20 24 731493008667402292 703011675702455852 829688320681637100 1123944268967979782 1904071468276796607 138160613759092245 1253507624028398410 1277821014534632797 2135232507401151304 648053561484477488 296358501062813411 108204619571898825 189106405508269280 1194076519192423884 585081458210420110 1282706074910967353 1088169005900002446 805324592333632101 1155630547682245735 622669329631871000 971521489259615821 718815955878038279 759196046333044072 727819622222638297 1303271446413452623 
+21 20 21 34002686091936176 2031018807735347769 2088610172322409425 1338217032070098362 1985546404421216858 50736443356459317 601126031633905729 2109364259226894630 303150358509542884 885757004640904036 2305733686415126675 137958659774782207 174895353277928104 293791527982892436 1567626363349307914 775204205783095861 943089796478137371 1698212727975793965 798284801818076599 1145089625921189975 1173030756061252757 1092665809593427898 
+20 21 21 559913634246806363 332077196223553964 2078995848373498463 968898337167827618 330516791528398931 2238797305248280358 1174866807858258470 814811988028816264 820949012551793186 2129227496730896391 1456755680778370668 1585422037023573445 1334711246005741528 920515676700427767 1453607068025475908 1889675762807772826 971529227363605215 1081058774261419870 176135359920422578 1374020731527008520 862495784249597431 1662681484729970312 
+21 21 24 620259617999602059 1354285906804565003 1438206452957206506 769477277243007504 1597826340234315412 214908045995547198 661288805601730625 26439534678850347 1815422295545058387 440475132871487396 569799974334796027 2193340497901031538 489527941227883368 1478411972618301083 1753817083383999688 1727036043188754495 1847704133284240933 1028182719340679143 497318491488250155 194201863293771979 1377878980583579233 188734278294771997 432089344432002182 877210918787790494 1580947428887331397 
+22 21 21 302602306348768725 1469887564893523863 1761891286930187686 2166817303047001292 1317226780988396078 382231379415828966 788253694508211069 595302796667540117 127534210755941383 1932517832377317814 1841856536570647795 382739101480417453 855569497487855202 58218678262973924 457603072643547576 1334097721184442816 1324425599331326767 878313977465939388 1635544204823074541 1216581002195148020 1518490742363524267 2051667527014029017 
+21 22 21 1605769037417174727 157517387297324678 736313894898608880 1546548741838905989 1888065255904146548 916061807201832886 2255263279507900875 1779125476387733943 560441572488349517 1410591376314945062 546952275098148585 167633948513162735 236926991138330657 1570310501923013408 1031855692901655906 1930997931243940781 1630114229091452343 1236554938223991452 7700480764820725 811335642931092943 1877102869613445690 2009329992571782820 
+22 22 24 1233204820117075192 2270091852436800961 297853897243749768 1964280205927273883 852365726926101947 1075667580578441538 398757289275426152 942282265539905159 1494580393868466628 1599699514872700446 1471470872396533032 44466909601166763 2033790904954302756 1779294748336482435 313067921919572616 1670986974199209874 626878555589899191 525070433097879970 2227729133058188863 1157204755870072973 923029250738467772 230846048045051088 950323638793171005 815384382952193986 959340798715393129 
+23 22 21 1620239933577570288 1289440452360240132 197351536276690921 2108197244370678929 1840705681080537228 125729250862166981 2145340210761828618 1410637624718046095 1953922586380501076 1707625528083066705 2138065785624338354 1588485789244043215 1545198200056456979 1784066990958943549 1122484025290126555 340094024455793442 1580905873312999404 2107431037099698312 1711833752390606593 396971396483103300 2201325465321458181 2160196795176535722 
+22 23 21 1929563399861580857 1703735579945233126 345161619173940115 1935175390370077691 2031853170246558632 440575507391542865 946969664490780263 958892536705613127 2089070833480095086 1774476424992257579 730959385176345550 438436874633200950 1636526493478590169 765705229732626015 2047178622365125449 929706844048532388 798144780071692444 1262611645110329826 542668926039693275 1681313627283725140 137861296065290175 516198745886755743 
+23 23 24 925524345519679315 862634064832544924 374857443051387242 316576022267781119 1862817390603019723 296724060370743975 629146345577035564 2109671816920072134 2187506292091463857 1135582762477455839 1093713577361468245 2144890771197274239 734000970151822337 1618291760690193228 1555427570100442504 162446200163847777 1112083891221804521 2066601210975090917 2137428942757839932 845299060283449396 2077522430434731621 1704771995041389401 1514375743539280948 1753560425195036850 794049795515062062 
+24 23 21 1963109452282925883 1344407465697627984 1565290152853373636 990560113007384285 563848689991192370 225223458453466221 752178072829169378 2111620848162561867 1514748226779131555 1243607251898098892 1301444407739143516 1672011124052490880 135068585450690646 311389851489320023 8850685876869920 1520330767398851375 1488352150154969566 1074000563091041332 2043890878515030003 618298509387112264 545631743606016516 1980726117606061398 
+23 24 21 815416044229109614 1463509837845383779 1599293139276427026 2124276859940627097 1285750336265465971 1769190533807027269 750193893691368738 3576905008296605 323545448409584581 990596398687998077 867622497888775756 841580259458432119 862173097093857208 552613189649709923 2220429043560056936 637699663046817697 2130886929069783401 1232576678473274396 792635856035128569 56762515062401788 2271615140789877635 2169657162009987304 
+24 24 24 1092173683735581856 443921188992465447 310287213651079105 1533276639905152297 621090298733193734 824286843469536174 776644455929667422 16488350491613734 1036473485675317353 958558110325802678 514832264294346909 843920103993235848 2066206298567585221 589906806936704647 530611791405021919 1166982914388007665 1795034279653092696 852244436910012827 1525346294961692913 1423975687597673467 1830432307691922372 453871771640959964 360023444371363702 1079738166010210027 1143873962820189086 
+25 24 21 492370700205519711 274072285589468364 294530812585743099 1342698623277233384 534224631634115718 1026340904096380887 1182643234245771666 893738371196437375 1901514896665430158 1858070163786803918 752327237714046853 528906833045134212 220573794023599554 2252748352204159667 344868172946710296 2039587545213617658 132580469504173608 240053939415055462 289693712371953190 1867813684752388610 1357066579918039468 1160427980254420653 
+24 25 21 2104436750647619196 235794114133685406 1183845916571503180 2203100081214709221 827826273812234875 629464617340469727 919541126144066913 1404908784301271496 858958182636307810 557967990511420758 1087787229599974653 2052781236487811344 58204737639420930 299370105429170407 2188031066938556980 264924504964499235 260048445414196299 1482738931812250267 998657071522232058 1593953945116252766 136223371031407895 866177875551007243 
+25 25 24 994348756013551389 1612326441844324911 717827624114059336 1779088597293610897 1240881822493751668 87198776158378176 2016512498741469877 733046917557186429 520535116420019945 885225614972175622 1854705260433106073 63087339083766856 726594729312726161 707733142441139957 2242207113809318722 1354791770617311085 1706290878794908026 544124962179210615 496718789543095890 905312700475742525 1416827475612177701 735516567731496803 1834082636854413743 961873817682450416 2074637889698926497 
+26 25 21 2118002730091597254 2112097175638485887 1425549568450673025 75291273721154080 1293120732206679900 517141762154690892 1803169697751862155 1872060114282007552 455732544685354588 288919988252248928 1046861733662075123 1110198412602282482 1256585170762098925 2297591345231862187 1884098137613007877 1820115155294196208 176250188105998936 2072618238202811142 2246353984826794969 455877693134648349 1185738120307839145 182957765402926275 
+25 26 21 667052254329450608 1261045060645727662 2191344914763640065 1515672621260515836 668824644838680357 781751174703568509 1969897228138743206 1178291299656207135 184208851760348863 1682427034395066746 1783205177689712122 1967819494172032432 1171752414623706060 2009030069386526568 2089253052833451895 1416426508726889053 2174869127976494906 38159715799758401 1672537925344721114 786999712164417628 1486774425578607485 962805952959380556 
+26 26 24 384028436093260035 1831655928244230695 285771363986932753 637910776682942156 572017191968938139 1648514322903633629 1923231812760396598 1866633593905684909 395702073566512927 1245689093201957089 689768199572339112 1951014045992419792 1647759362747986039 959135036619073155 297328414969755683 1553892405327762424 298515480325056969 299377067855191465 35390351545409863 1513240649308641522 2049054313734310385 144850777228514315 722949827518431018 342660785903288120 1642792336393147369 
+27 26 21 496886386007762201 515007072714470309 1487138890589604404 1336194930237214479 342364723753571383 171059231076546767 1773726403870983521 734499555565273353 1586586917188468238 2115557216001009578 1579496486187338170 525513874341166677 2263661589516453172 519320565844163329 968614034526705784 237578842500044217 614187624819544565 1542289720231809950 1251597613659298588 1601751231145768814 218850666540514263 1305128509618683345 
+26 27 21 2094929698908431130 862041275441351756 1982313630467292905 1204015616751886735 690580901758873164 1401000329168043198 2048364910852437685 461617993146277651 1171239757984350010 769555941466736747 1311433417353112043 1983451325544825327 1834073661746616188 1223977391430909263 621976324016541097 1549923298908732165 1837223870846373545 1341666540280585141 1759226412753109280 1157506989925395673 1258551759199963942 1443746542162340349 
+27 27 18 1472470258432229588 1002293436160954782 1678751647759350879 841570462369410597 1205535374159404620 2036905138985190569 472315818181653695 796868698741334870 1973406482535817828 1240586855922185612 193531945610531265 1906376916860368986 574489633822837952 1234171763301380176 1350687422898356527 1844209185971748293 628322334698598781 1155222681851249961 268289402260646992 
+28 27 9 70606146153294438 1292899604931360451 1162572706683110691 340350230356940452 1870005049904132006 986247171807382583 773020635160113255 2013336341404967801 1252889883122874331 737977323148473447 
+27 28 9 1130312273067369465 972920905372634652 191553019994982200 1106304977081026139 1124344689452680352 1438918240019058654 1093349187633074186 1659092177198522292 1768953546248648883 227573777894912569 
+28 28 12 891277159929217056 197427879654329326 688464675546111036 2183966323891365689 2152853828685834520 745597460619425520 1362223529984075494 1356163703418889753 1786137941457665749 1319901431190728074 1856760485271084183 1091983826394863173 802054509288922640 
+29 28 9 2096187485612605557 1770107641158521842 1474014190152373739 1408846726176760870 1640964938688328394 102982384969817438 133501304559888797 1588228787202328459 1919513602659978817 153535144479168159 
+28 29 9 2156077754714979810 1021759921536500516 977709204054169143 2112319714536815587 1664282814107595287 1221962596312398138 1575505388168907826 241295732862945036 1762383301639638827 93688868713998119 
+29 29 6 1626321620257652416 927783232777512903 1232983958831375125 1340924091704811517 968542503530843386 944038053498560860 610331893789566678 
+
+88
+0 0 24 1925427018051269659 771341794493627077 1345227034501884103 1123483670957135649 1902557917294073072 1726810435224339674 541367429450726970 817344350129813259 929216985012450843 646852444239001169 1651974880302763773 1487480036723782958 1039063497574547583 1714233467830229411 1992418446338248255 474411580920019090 205470152033869959 1861458880475653130 14965606794087515 1986335263243257928 1664430278268722493 85822592468320379 1748919709681051099 259873637599362514 163604607627968430 
+1 0 21 2075141797223515820 272240918863237137 1433806479133836423 1701634968597393769 1694654145208852596 1342618079447527298 351733532197016020 1935047409544433405 505426055852460981 667356828651704516 2267329554184720755 1954671975960827659 1734904661783125061 1809856041503265550 1666152490110246269 1671018388047495881 1154157206588519212 110089052936240846 1110593478331005704 1001885295571240770 2080186278197716978 377021798129474210 
+0 1 21 1542312637750251838 191273374897991359 676407451371110436 1327149534783171817 1350462441777461787 1719353296300635186 810815148809294758 1694265931420381458 1442970457543225841 465215548713094827 352189868431003725 122365575707987882 1854081837528086516 1115991971080320939 389730888933083896 541075005449144250 1769907094786079428 1352651707559472116 853733102238646132 1100682660260085338 183194221493561438 1257170299037431079 
+1 1 24 1040961616959410596 799665768980440998 809709116088453745 1109534379963719539 953395024389680692 1597331917304364046 1401670266907646611 1765095368349386576 706536739486786849 802267054779508761 905755714158205866 1897735422209053097 2188945542111123534 1694475670100234168 518842434769902387 765665896885261061 104400689477972287 37928544247587524 882610436319042916 392407043440699524 867440648698190161 1725043792413896631 1154640604682817241 1167992961621321766 175037695367722608 
+2 1 21 1924865510072106046 148031317169072355 397077344129708064 160220295345711875 1626840298232341702 2209255541927956028 251018298685641830 949080567235247712 1193962368727019380 317245209291358629 572304608233106258 1124162570061870009 2115188443079129832 948457430506036800 2059367027142710474 1845506491131918651 1077476234012288616 1401067985567797786 1515067296973817328 568712267828440997 451891810903386215 2116931805323554261 
+1 2 21 1135220946085167780 2069082254502803938 579333017524786032 1395915217328501268 1843264621079015310 247761831511358083 241636500442206195 458924774804658329 1983145318989368483 841025599093459427 1202571144711930250 665434569578302057 1268209766311301291 727036075922690317 1238601473963316356 480493183428258944 2111119129760181671 890422618856732878 1952353398456745834 524397374069134854 885788147494564729 1888971362180511304 
+2 2 24 818366205309003203 19773311555116433 1353655135263898670 166821058201652894 585810728789375325 2272087075272295562 371940114021672976 18283472144585708 969172398739215413 2024777653758199828 2171483031949808869 1722244056735991909 641173085572461097 660057784549352292 1720692197866628463 783102433420004636 1513101735445132899 709337428995167127 807557712269092938 86611784477238137 953750009748309307 1242963898064956863 276723199292485704 520226559040388475 2104406312362991347 
+3 2 21 1180918699354593756 820985712001905804 2032308457760808794 122531270911077797 105402589729814197 2244358524119099639 1692558854415424778 1692045039621998711 114916168166842370 1306852651294312464 631733776978887934 485646112621797353 522697166621217965 217358134387894369 1097933386129338963 1065946827163566303 1474121185717050865 594584016042468324 2172717196982941457 828809945157706960 1981724858678020617 608245619701838971 
+2 3 21 949888234526142751 1677408117362939021 1136613749627217839 1063870627772666714 189268382857950445 1496270403440296747 720547744988411678 1055597425621625600 2080485670046341282 1434211438401844214 56925166607368116 40731956402000656 1704677531579491046 1282335691291650175 1295456758975015316 1850407002179203939 1311291908273755496 383935601863930304 191724589736184523 558570952567863930 1757300767227065662 48812442009617329 
+3 3 24 1818444991636190850 1962895767452270893 2057186682080651670 1564693989352610162 879316495661578509 1184380586431615917 1946213521042033813 1707904366196649805 1045481655814805675 798791344801039159 1356260001069948621 28912257819098217 2222159606125901198 1130631169028365878 1005704800402628077 1960351667621602909 2056728060078446667 1224942494849604114 1267628996347044127 1043381485286706456 589511201577360009 48303986579331313 260272774455867821 1194190448963818537 1487485217284145113 
+4 3 21 70243006916164151 1210893118229481379 1738768255027889341 1978782891437278446 2119114966808985412 1782654908437219375 1330631443105509288 1317876350981708565 871774312424811131 1564475798633419642 1074260023451316163 995019005592418493 1520210671678878734 669322007805383283 1077320993925961610 1038625754282268762 821611608239046887 557232140299507567 625546084434205579 2099909184265709692 1887963865606946311 949528392675806389 
+3 4 21 1277928325382507895 1041496508206813561 1877188519157325682 1888662792561059117 489064021548100893 982763025566585920 1432800233768824080 1707283326631351782 1095699723664662450 1883531790223045025 320442798251988081 1456081775043797486 914445741153321721 66345220310002457 2085708918434019025 2105861776898294176 2172848947606503735 1624679982449150662 666155952253007105 2277685468650052511 281554744315544898 998036152985990983 
+4 4 24 740358478648861114 1512829298245616401 1224463199283261686 926127373971631420 35300220975058036 1475064519760284353 1783354102237491822 1603944147272222285 149235696012531138 1531635862638120604 1468329695689281752 998342684454538018 1152346256570725515 1485375062634711820 803924433232973856 1772262553405579541 2297018640493634369 1074112148455706847 235595547804830672 557360182551057520 1538973651190767960 1018987811410020995 1169540610694364924 515043648455210592 2013570822733745844 
+5 4 21 1448135171342913937 1102951626323822654 199351911220960255 245184582690413812 2124852174866146101 2127930550692742328 1710180092607956190 1866756587614946980 1856405185124510760 1180787150798928023 301787987189118904 1509134731883301780 356163620543810356 1263214853237340294 412216511305867497 462392910849538777 1003390826943067444 338012827177822295 1631305186731028724 488866067705934658 373083790429442728 1683177725124086552 
+4 5 21 180898815811392453 2162950471012654375 1599466569594879131 2013931558186361144 102710356223565253 1446366601355577637 1641438310349096281 1558255009084012954 557749553892955655 1438809046480060106 1298741651292209879 1991651458087690204 1177748769822766260 1795310468169176356 1625072185826176447 1047614267456184651 744670024385471843 1445294182729141290 1466349595625992386 252168166744640738 431116921182382310 1539654251493498120 
+5 5 24 1446812742189399392 436082448521723884 1191836740680307471 102323172975146872 1136526374521443246 515324747414713528 1873776558371427918 1636324993580076269 1614589780934446022 874412238304791323 2260030805295548660 1518602897521613238 2296384685118444503 2067247425520476018 2302585125136055085 190224793324047687 1269229932572570091 1024957307820198462 2081848514139092077 127231591019849735 994253024309202429 883162352624645747 82616932066247214 822656793223625674 512307992452125564 
+6 5 21 1002344477999731825 1277823642850281426 1439306998698205764 1275613601530285996 173725624020107241 1255441475609639097 1806024057339598586 1582586322942801189 1773815507378581145 1491849978685213745 120599375479505105 1160412787917217480 1170730945657106831 1778611555723795322 2221479267860675703 264255301230998262 1845571676606594099 254809137648794380 2174591825265725400 1498439581157057614 263327451981814818 1465913196255819732 
+5 6 21 2243168371739312126 553706348025972401 2201367425019541731 2192855131169810685 423092123445000239 2115374424934997749 2038277413651508165 585298944410489902 1914077999394919696 1489735027288321202 2218281210530431551 1981946545174311970 1662664501597493720 575257909520756771 1497962376773064074 1983458657008396337 2160890771128131166 1404561286552682223 1996619827370548392 795667723529838703 1618053911461570016 1219442306642838899 
+6 6 24 1798262844898308926 1042381164961457787 1122218008116769487 2054928130837143270 1590470497941670159 855603469855938862 332157662862428625 1647391245831888022 31395067371575739 2148017752296994591 1873027538634546015 271698161037389173 1825307074304569626 1057393758280350027 178851393352447187 1521376088236312326 70297673087186076 980694306070637477 742363180163281000 652309349951580255 1966930886855889061 1327876657856622383 2076340497230648206 416270566847077947 546118234284174084 
+7 6 21 968307102760654726 1105248703560847456 1294151859643326836 1513557548748377798 795559601577879349 1701878163152142246 112190922540620801 889068727000329081 177935223875673158 1806999733974844125 1982786748235217349 736216964369810787 162280659316997792 1026978338698497640 805817601552142118 309412268007894451 1203168349651577241 1036721568532012080 2137665942977143344 1215940089589054258 1510983622513381269 1639810028680783345 
+6 7 21 756353084150810258 748241158628187330 975125903835869221 335203048368597778 1455865569888917556 1268501667470002231 830704640518373997 1427870173829407849 421816915420126182 326931504158089841 2124242981865640041 1012177479559804206 208678096631725225 1074970455885965321 214296186781454930 1642422807060437498 1076162495550312387 2240099881763678679 1584829051363462789 2131613355556761362 127609783241643531 1026824468583483273 
+7 7 24 240656467705043809 431470523084080259 1375642659292933667 1754555463554354146 2056293693348531888 12752808870484648 1776446034120629054 1636931715404060321 482402670016679884 1084766199000275126 765238401898155267 1836386589131458029 985818661329129138 1499590529167366766 372536977836073277 2081382606815612242 1677596345076013312 1149697855111253193 2164759264312818917 309235166182596034 557890079519631643 1284226109378785302 1376296806355421608 1727027138109475487 1908286833069186869 
+8 7 21 1388798862573691607 550559293727644375 326472530980238387 378294698147400950 1555285074412131820 948687703234000561 2302464982646905572 2110517497470520995 1042201595164235499 1033899786198520156 1572016890123968579 1637612119545774335 1516624362147678036 1240406341296540706 2159479533743890607 1405033756074034120 17155343211335004 683065227312123225 669119202442667952 148246346509488697 61256585722677594 242878888968955881 
+7 8 21 1344228850660772385 885637193198370744 1421369768055590700 58414412370155055 2226196998254413705 515894450797189283 1829953886344417439 1777151557168190052 1174013552457021343 709107871702751286 58187752124590331 1369631939401293305 1194613008185854105 197449993177895537 987284540910861993 2209904237233912694 1655324755920298156 1145977815657693478 132122392391741415 1473242236515911806 2208436639110774160 485620834911255518 
+8 8 24 946604840941748797 767199983250686575 301609831614053334 1679855681159972517 147222216130948948 1027638098523381678 2265400897616148551 1477498863880512640 1583917653057851104 1994923463882108141 347942701653888267 836133721713379173 1674680714939596091 775955722115267226 20463259769265742 2238874144313986544 1002735393426515066 1121175906847233496 2227414414221387340 1017433839784087036 1194474888727306288 855887593330508832 279554610783543537 1080074844105464101 2135581501290917141 
+9 8 21 1258043066947876054 133264554220030727 621393855979087517 1554577742496445729 1303420816753366403 1808141837602031226 93484583710854470 89811942678076869 568388104137896902 1281200236556765899 1963721861387076138 1070241083778406282 1182833750305772392 2040247725914530696 1715865684462372498 1594494783371384129 454545889823598899 622886876611664149 2061842050630677720 869168536274311357 686559894476663514 1453586194157731686 
+8 9 21 433001924811958679 363481859120527931 494732169981287255 1327984445076024551 1424401189783512236 1382188478180058553 1262143702441478852 2091744054548307661 907841549133536794 2211279553539046452 426506445670850759 1038171556533718238 1286573525648118471 1337702297665466213 1834818660923379233 1641875473310898204 1947902920866550438 262479775244685384 1693605950932400698 827781588843842859 2283151761348040552 1886501639268996383 
+9 9 24 1644073236579884392 253268430155615618 382331183347287847 2013280448191896618 191209697935801594 928410830928055234 1531458274819576559 2093706574613947245 365167347716044677 1447705764261483222 758844304470672320 813317071847546076 2240616012152410967 730069311635488399 1983116360517605317 1496819571345757955 1857121063735343319 1068727637508036431 269449689334392203 635503206144605418 558158624084548644 1045014678389235662 169814965805254175 465630902946955083 1028558193652877515 
+10 9 21 1957714539703828502 356736422961736803 693716895225169824 238432972398238155 1474939727285524607 2123573659757539640 1373657872101568933 1610082524700078841 334353440547139996 360230659743893007 1417922383595181476 1663166432860058081 220293932878231407 1428769104792283745 2208772327664953444 1264042473765902402 216958832480109137 696171219925978698 647345342108148375 1729820125268257557 1120697117782029741 1834509383524945681 
+9 10 21 268074841681385817 299400287119778868 1115153217654103165 925796989322889511 1165280407362036110 1345820894610178540 640973597172495186 1215614008217644864 1510641681028846135 1953208822029099245 107645954010724990 267980528403122002 250301974608899840 938650152908664341 2050039949484993202 1193770173412112356 476677083821700044 1547695214608690376 2052012654344319048 850983685350345716 2093084828385105342 1626391832507327161 
+10 10 24 651051136623230693 1517213001523514179 581586796890259200 914815765464713740 1626717843243762604 1886877471963467731 865080519709955702 1911936496175068276 1583699819053695315 1067679855475325923 1872365782276172754 2087428188444328328 590295447867809295 1111401828541510260 2088403517782783455 2287376206616859892 2205161135793938482 1656681035820760248 2067777850706282065 1375499594126717796 1644864382594727954 2206044988096829138 2126940385756216562 1648854088759830688 692169345388797113 
+11 10 21 1373639897997086825 1311409045996126892 435981046708675630 2077931779865650326 1138871214085441070 2149363991432870442 1781946329891684707 1687949488796480843 32512135694485653 1070441761255124071 1318130946489120323 1343261765797055330 1293248076727480237 1193004252350380355 99398658693773133 867454668179785573 1562491494624225333 639428413429943391 1123775563308510068 1610813297090842569 1973567080046399375 1875551362317904737 
+10 11 21 1854374000607540745 1022994366643478759 1114440983466895180 1452591641392040814 322289110609332474 1189579356499483567 1035507342041732461 1795947320168971953 2001447580884772369 717726793029898295 751920835920352539 2078613895632938062 87194782159854739 87880969781785599 2017209145984173086 2093049547562778625 1570792153827924307 66456528556425081 946863616502326120 1034429844145789002 1221791435507839506 1947125103156322008 
+11 11 24 1021649558535072985 762737756786835057 409483046118909247 494926784301939104 1125056146579268081 2045987121515772688 1709354396910158072 1870860070823985690 1759611223117069995 1060924707785911749 2000096240631513441 2179364577342918647 1179242745573627990 1538138089755782743 1138365813189872228 305505143167444059 95238340904365283 2134702054566310776 843055671647627771 697968717472345223 1914232825362510557 569482317122188041 1963333642746592367 353962949730293439 893880626198652653 
+12 11 21 650413945725427954 1996363016606139702 873343081285173204 1228401706717445087 156798759839083341 272513634196022468 1453300290096850472 2122731250027795867 75267813314434438 1768888198320352341 259959149036159843 310418803367257408 1793689047877866186 1262530026430524039 1508056374034983217 591117970350597967 632063349266795864 1975419150096302832 1289856643881941623 573297863567179213 1607404910493447398 72647644727578940 
+11 12 21 1401245619999088046 1945410535014740192 1515360643384333357 160757443549940425 2302264081955769296 79344850611144055 515895113523445623 606301446936323051 46994692496155111 2135074520125979487 583578036348020486 1956484322509694970 14026845512486885 815291949473886649 766653646969009811 365140544691523666 1808550287106308827 224647854529821822 550173239803949796 2042116137347779278 1113710558947222515 642331333761578512 
+12 12 24 59397564814694052 666070033270484926 857417992635375628 1655824884667072304 2204353422989953986 1992026308177829207 687090606508251126 1172242813754119517 796514948555486682 1047221104880781924 1968093744262504613 1482853406736822698 519400358740134915 2028828016046316279 184144014641621554 1577334448257221971 1805014391074256587 2093625162771423494 7277447100464314 944971959610095719 477524328479764552 505031270301726038 242979423098065781 629213205368122405 834183113302411291 
+13 12 21 95749322856108758 572287224519223408 2285973593479619730 2277003057790709681 269751806720868249 460616367480652604 1369732277903290290 1141685859406752900 585847084318269385 898936737530501732 2086091805550022920 516885891444371777 2121189379271727887 1158410339241528341 49635133277286091 397122575400778309 57400953718977744 1267054271964246196 1035851844060041916 2025426865969027425 1794263276741339202 1316069997729031585 
+12 13 21 1342853885047070095 348946332678811578 1750566274811364736 520244254851622452 1552902834102693513 404860528983792965 931805116403058750 2126077850875924138 1523159940263959104 116396287195067404 80924888282496963 2130938765230349554 119168817864481755 1632363263370788775 81199212175894335 513652314927485266 1474751082169287829 1974108135568472396 1517332610946264198 435334730105034582 1987396323880135022 1832860017184954608 
+13 13 24 1908516721391823278 1933651755619967569 1306953447289064306 274899073390011850 201788277419149767 631882013640515295 701072238606410615 762520128381244562 138049146332672652 2042493794442106327 500131649429164404 2133689132809893196 1545800179116610513 965099918056363722 633352815732297156 1029258252552866586 1444506133211778122 22891338109601441 601961687578606085 128407741799461512 510111725739307723 310871434097436877 878143217094438308 955217806371745934 213847487402198854 
+14 13 21 853528941055737456 1812400253291897077 1350424302384236369 2137599313035795420 784809641825496521 399589395651826152 1731518374966850715 477424259408610352 1117583285899435672 18852303616237951 2027582798919489615 1924644196399552036 136052600321681606 1931089746142982540 1385416407826375082 344041597175450717 1334700907071739099 928066974101575930 1398175499638702253 2025969639599792868 828447517698902403 732975169890449370 
+13 14 21 554069376216078632 2001978562866661307 1571726773284485596 329323653097995936 1521086024119232055 962746653504959866 1513118033489028164 1561482193171498342 1699439211737469247 134650145042673510 512894372114873164 2141918254022648423 631493442661788971 240997476160202960 212301196952650035 770659456075174700 1867341272432314405 675978047325970833 93899900927030800 650275120005515864 1095370943506644434 1339092662732066832 
+14 14 24 1289061370911528925 1817346942799945450 1696751223693506817 1106385736239213313 170619409254559956 1550148914715263086 331809176609503227 15927269865390346 937520857111465249 957361309423800906 688132393341159836 467579260456507409 1506125098825657634 286000755892220064 1883769465842957170 1610088650031810938 1077637097998714129 1666683262563349808 340772756587688166 35540096896302487 103231457134975519 316696058700345473 871960624923674318 839962693495466578 749614949359149924 
+15 14 21 645109528485651158 1442135187443689127 1045048292215303293 1226118684010536028 370523418704802494 1766633659941943684 1515172176548172815 1278551992512757878 1390274300645574090 253607375841458662 243839695236114910 561259689333868298 195948302281863661 743075746589910581 2064189963971582402 982230355745578098 1973677909798457233 1475529619313027264 886581890813833799 2177329443859277340 1940845360776218950 1272282149937573300 
+14 15 21 1076535504157509362 118869627022117153 568726451997115587 1552076979352799088 2153576748152772108 737975667467772525 38051477577838775 666702605002434462 1652760581391930763 627322742753396333 654986588137298053 2255815891756781997 128365379981603842 1513141101914151475 1472536810636412567 805525722142465418 1923988852231616129 1840684480886431005 402878017611961323 1260700663891555031 1891379369363703654 1882086504704367582 
+15 15 24 2221882015877079859 756711101291283772 2002372428393517050 1196598696056954816 2170176739976057221 2031413751471935217 1001475011877188694 1685559198017124162 307780207612026903 1935048641289900213 1648530408498875424 1907899350607792483 1062702940832992325 2135289732953075279 1206269426890215459 934603151675122262 896864718650656909 1201330952948832013 2021928577066419331 727342657691807684 47104663911465552 759987959267481525 859979350033462678 1290658294312086195 1873300184043733320 
+16 15 21 1366754344132673857 1870698583926949973 1362005170079736297 1508343539948045531 1584633910192854547 1913101351893977497 683901662079904443 551984275927035579 640682083515709654 1793420189314012248 411445506833722433 160461255706900988 2038793505783867230 974895590280335256 1524113917389476582 1970564497178494225 2269373574418199395 365326883570338113 804448413193692724 1558303348118882154 889905319076389662 142011599192238654 
+15 16 21 267528780070954539 654123559028936752 906934972701777010 1239487144745615919 1099473677144883112 1881842153992403537 1351435791048571623 1639680420235384812 86882699700815524 1276462511986345534 2168222953373878960 1598476754760004672 752287738600949170 442764895280024610 1260050734709930376 975715035128955278 917607503164221357 286904479592789517 302581343011568852 1076653557245151677 549592669996611945 1789531754739816810 
+16 16 24 1278843028526014402 1602523551833924792 1983149891527604346 251999005421710371 1969478484840466315 1625533832082277241 1156842666440063954 343023605735907520 1873490724334099674 1933681532766198902 1962073354304247633 67125548025819032 1159712394647585458 563297563344924848 1767309560932946452 1733249743651675597 2075869975843945503 893438273901663421 1936923180285887930 157584207759902219 1514185410891510814 1222779027929646116 951240389833471309 1923337171448614199 1062829415870597180 
+17 16 21 1693720421883449537 1471105595212726361 1020685182276742573 1461333015850866428 1626547665994618403 560315334181444454 379528398533780581 218955440336859519 448555767303779422 1219178095039762136 2062101185716388625 1648990169517866632 1874957370377834033 91783936240125491 669947604137857371 801111933156263606 1929796712566549931 1881601105621106871 1649748023597382558 2083284268486429391 2241509163732541321 714344369524526870 
+16 17 21 975614435308219216 501621432957428524 805276711858757791 2301766165146275279 580342527114522295 1957956748280933797 30990943308654943 380597768116057195 374341362895209187 1864086521322067764 929125869522446037 1872188573456067577 607830693897222488 477440735756361481 1404039557470528099 1853476569555485114 427131018207600824 346029852654216226 2120443173616862447 126359597159292058 610750944844697603 887018421749932581 
+17 17 24 584554958960964961 459984877879214833 336450274831711275 1351186965686313273 1816141738569258446 1143056817044809056 1551846101413780767 2116100089403516955 1746933453977617722 227099074628538037 495085043230911941 786090333879067214 1288622171884963141 999039360392248854 1589288806997501162 346896587383111380 1723467172683575292 1481319090332482334 447676572935549626 1441218517703219036 615717284508154552 1236071324723824630 1077629971831367492 911832989905397381 1742844695570265245 
+18 17 21 1814635559095726375 2263709068407537829 1493636354464007432 1210049265684014260 775732458361496928 1916424010096029031 927519771876042182 306924413240973042 48055449031208714 171578407314736872 2079351455645623511 2273876949595044070 553950669747509287 1319908197731283904 216005041398437926 1042833991805720428 1961471477105186313 34513750958997371 8665384828316926 1814397438271762613 2206184994101636627 1576961711598946388 
+17 18 21 2274072660547986701 1054525111449597420 328815085957243195 364027727930498263 1542183749725117884 109778471133777951 1149852206726341443 654031115720627581 306913431583415432 1402170527680096042 1247443010108309036 849806315967901404 834742455396356765 182758076435298062 1659314904850968006 1004360997260580354 1657152656739650063 1289199998070318270 549002145618352843 135889273677862363 1342709833181420429 1246253463737484016 
+18 18 24 1811167470870283042 2137216466984855337 1207437782868026316 590796302850739881 1284850156258723576 1439148841706799615 2028913553115712446 1951357661562215778 1947235216133812764 495189024484322076 843640111336674881 486933255693067684 317390255267916358 690609899605515196 403582074140810133 1066375119178036623 2190261014383061606 2113716195615218619 389265141746689356 1790516705189382939 540405579172285301 1730377444161975090 1073596293083767080 1095285220174768214 1609070715562748094 
+19 18 21 1886854338866205799 1187980714045463667 1304814009399696303 2019727785004054258 1396948650299034064 1931821552270095647 1041951250594571786 1619311832107740124 634406350589689313 1904540366480591012 2129422912411629856 275681150110183224 162948552661601099 1113243519193826406 2241752645491800522 856238015035765742 159271051839016035 1960683038512072584 134556817674930139 2269811884243628900 2018002027373772242 533432513336388459 
+18 19 21 2285866913353096376 1110044509200503219 567961658423988935 2019831609239278276 243248580239348655 629558256281492032 1269546595170776516 905489637899026566 366031611568215400 873714880140374552 1075642970398591742 288546821271573032 480430740167591838 1772896634921640591 1650700191399542208 1878962583834596796 996218098363763213 266294824258322799 1843070944588544277 1813537333904885013 484272132181319136 777869879833254351 
+19 19 24 529690736352364368 870356756431879704 1728720597351123630 99792562362837152 1461901701032483940 142200566079489262 1207164210842695703 1561181411818325496 666513127163604853 1212759838759292760 715250801392571480 781496923021090843 745064655365331022 727238599903211569 538516387044325559 206258467575348925 91578885032717567 1017803646220273178 488222469528526368 565968311473423432 1792656462831656944 1827207026639386282 1277503194800517384 174002418656999851 980473931024327088 
+20 19 21 1846324522859782874 1742687663688025053 1067618412312257609 877042817210591524 502790661709510387 65325183935351358 654848228450979513 1907243426253334681 1214577261220655927 53477466823818269 2241324777562882583 1180895232810175635 238026974685474527 2057203470510282710 1621985507671147861 1555849309760877250 2056934227357910491 638599979892308328 1065046683202606249 940457506807510365 2294555155372243965 1087335676498871800 
+19 20 21 1819625729893046345 828132523736912256 600906076029927300 786715267700480983 1353415948767262251 2051616108329936054 2066879930733788195 1398679028285443852 787403176227064263 65423623866129638 1956372553696193947 1361472595914637356 1851591808348863278 282883595340982686 1553082473993146052 148923148848702280 1408243653481587338 1856290690623744272 462242134949058291 638684639862659434 688127434983610930 679682249147136431 
+20 20 24 1060792942657203229 2238264644701121163 1081896368030238796 1486022858881674717 1531237833872736126 212532490737227869 1831447224990032673 960731371784777429 1821682723479401410 654472318275091247 2228991355782794849 430030019392163975 944237383420353439 1073693398114486209 1798345048530630044 1618437164802933927 1855355532636796677 1816785570144917365 1776166159071860555 289133291233129268 1700820722576712886 347701195625586513 1443624898490795784 804680347515471782 259449392502984496 
+21 20 21 1183619073293149092 492111314829835674 1057371452648206341 1099472075022950660 623336577163239937 67256457828761333 1554802693436801828 2156914359040637274 1460015931940222007 1298027325185354512 2102298394568359604 1016161394390637432 2145679044263962748 219857942774423411 921482295237483209 1084989758000947695 1627948519677075689 207523150428187860 70277819515293484 370295916544238494 773067012804899967 2195998860239120575 
+20 21 21 617748884765906808 564617001132959183 126046178876966104 420651477217272601 1019703417913280348 469061511319347124 66243131741365878 437514249440926663 689261367474430812 146182180432457896 464361204492966867 2013173868544319312 1374695617635836740 278422131687631715 1954370264301332255 1687594377756928935 1079074579740851693 2186374012826426535 524013885315407290 118324396844281311 1283803908025298078 1259379204363703774 
+21 21 24 28405493783482258 1206146692683501662 692966386428070407 511939118805207648 1407431997433105495 1595570293528672246 375453940422848923 62914445548125318 293466497062026335 5476324806870427 237880144348936685 564144494915877332 1186003316594181737 497676996710449433 873492171819684936 1341587843825599713 191309486207953966 1453848303190513962 820908724097354507 796259737359082018 1571232982515096522 1307006105386504439 490757793753499405 1272168209675290332 831371234235329806 
+22 21 21 170251520298462577 731469829399128521 1643878108888937339 1519248303281553506 138629002976719845 2144939087034797267 771865138546933343 228800535881583100 656933528699885211 1491947166881561268 934261353587929391 1821490700756816181 763374941077438522 1888410771742048988 2047869165172424888 1680762172705685345 1466221893554093521 514997647297050618 1990182798408404549 488837836582080498 1581770974406173123 1306190088579591119 
+21 22 21 1855375047714411762 2075356469249674092 292817539795363316 1781629084182418361 2133631143696159158 1138085226534996830 473233193496155510 1157343050912257018 697548400452405016 1534134593608683329 265466623227284797 2023491621774431085 966849303046621019 1261111323528390234 2225916254550929510 1761046055962498674 846459116632455137 1842665900428847972 1835085231947965241 1738742826070074670 1800901518316466007 1045711190181888460 
+22 22 24 901931066450564340 976326066171684418 1689618136620419380 185652626092630544 1291986910558317483 761965576836123476 1890191271190043465 1384780340094768496 191719607580280559 1505402934309134071 546039052111313429 266428365525853348 1456469273685052147 128186799222015513 2214414502650442774 1604235099616741779 611193485576167135 1675807815326500589 1197892216114059775 453791197684569820 1355005758508197939 1600626042225836921 1850798249360174657 1976317166289098785 40885645311165564 
+23 22 21 1889941770696618757 999531029130008117 649399736937720470 777741558360229922 1247094480369995880 539398889778432268 1869138067381543779 2142274890307304136 306257880823517418 1339785483223015137 1716886135889600975 2102432868802570659 1582566002203221321 339804038045460389 1580697551315692971 1005711948027376162 1994699592981223425 672275432874531793 279904544643591541 1816765416152814456 382870846488663849 1969736180602740591 
+22 23 21 129006833510821896 675433275008714649 380057601323110813 1825677044672888630 1003042911865451152 1822361917595732517 722437257327448101 1081464975743324763 659065694550694003 1918864633540336122 1960878638359196025 1146927892818945564 1008307486960771238 952504103417869644 1782636561790003981 1639142631211647510 219117371649099609 2228017128214530553 596140169252310400 586126451636314338 1424835215771911569 1195697932482979527 
+23 23 24 480323399094584762 737638715591303559 288363442847176306 412599504693509287 867006611672119617 1988893265348824962 2281912431317255884 1622725702009266079 1143266554850050773 1906564990668637370 217729137359122508 2264746156347999139 1372286985058260838 40454823769637279 1738242737671114253 1386448001148112646 636138664073816318 210730506478506129 26368332310798256 1164002851914545976 345364449027602269 1373629487692360519 983678108580243036 1515779515688143367 1409299022415245701 
+24 23 21 1782660498686876105 1155684188443407711 1991661676534930331 1155391609940036695 1627673435549825934 1852034996084821060 2171830915934417356 1048249722211154433 1437231187320226890 2269931984745314452 1122765659443827633 1396029076590311747 1392851450520416545 254709231120675786 1602295733198002718 1309680142493777429 516287732233928819 2037969246675342469 1789770541185492329 2185143329793008815 1738661749859788227 1702779793746728575 
+23 24 21 1880507402018997991 1929496089475325483 387273233243659205 1086792077605161301 805042755273453351 923984137951066887 878898809527317024 1011156898883114207 1222788685045286382 851021923675843499 1812793633068044098 1793415408877102683 32903054164904692 2263111513921404974 1991636922411782172 2293234594278709419 2117762050801712742 382474588471924840 648769638219272544 2273146168740443018 936292498004197210 430689096049982758 
+24 24 24 492419844190012971 637238500505136340 165491062505403688 582014181760590838 1539761901609459272 293927791592074506 639278602689568978 2271324955845999241 819643379455987329 1273282797425356736 721509317077281518 522897436140328299 963704848134313593 827327802362840680 1876113700223076041 1249626487375084986 2046489783365558836 1733019148691201430 1318556383865137815 68062725079464966 203365907703456251 1588917596719413608 922924429352888925 1140424805723094899 1529503711660912094 
+25 24 21 589188452800377726 931224900468204387 1169313449511968532 1171234269356372540 1047511170496006922 1226556463685861309 1088584044537658332 999406068301749368 652110399492004087 1446145604679418618 1137238714913850634 676487945119216133 2005468022886538566 1781743920359423837 637003804954289026 658315917725918643 345918683832557554 929203228665508379 1090102509317100947 1147594960290658429 2148719979497377443 423168692224343377 
+24 25 21 695034489503153014 639249681966157616 1853810478045264293 1820588041984252466 1687261934422327165 1662248570051466420 1280775015268298877 1038021412539955982 280808400593570752 1156554642077177217 1601363201241069656 865226669288167758 354317829507439998 1688382494136666267 1216278503647541685 1764797406728625692 769662898807171373 829128578580847233 1681849117621957624 309651525779243873 1520364296401021602 1868635556611633477 
+25 25 24 234570557969939788 1546246920087097530 686127407198610438 1327953729474214245 1727096866591324194 838276548145816462 1753163089149758160 1216001649789929016 2160554216278881161 2169886134530610387 2102409076324392698 907474119031785867 1133961515517298316 839901781502663244 1649431562231708130 2068389036939605163 2108413828006408926 133536720014102111 1897122678845649549 1940026222902399700 1539059482341295802 1293423522638667670 670590084113756625 2214506619400622904 2091399387729167843 
+26 25 21 2121763190353534135 2245579845989788671 1573962235763495393 669858060751177101 19370809050647321 1707072288149679157 1372396272252545668 645168124306817457 470580626484039188 976720427226771697 1622716723309036021 1061005511015341994 1783906671423733993 1463428199074735146 676865631995021561 1397320465031759721 1294532205781359820 2285888007841679729 1697637711418332518 142391122307734780 1834798706430564088 372706559764347692 
+25 26 21 1730408964687382641 150887730618581604 1357238587191026796 169033038918467814 2011284558015610377 1584437942701688857 527249838366433143 35663096256107916 2295956423387068942 938154335118640187 2241802142549485205 1955408406560370476 770510048606246748 748563855936753191 939384142405648734 1959467358071939588 1646686898897626121 1846204305635722095 1794241925571245156 320393725518068507 1388359241753373576 36030545046273623 
+26 26 24 438412691606525410 703884542233259245 1430279024526900630 589344374523569620 1575221323224412352 2130089847471320402 1672903149153623111 182579998835228867 225915102145071632 2015127886613923285 887535166913112104 608481764365530177 1766711047689524782 1569956274732177410 1435237542515535339 1275022210205631573 849305460770507708 2054441661300689599 1267978156443023976 1847360474643995961 456399835556183664 1448244258090353353 2256952362054769101 983292597400931346 1285331774051507804 
+27 26 21 1866195185322142036 828286466162376338 921634101553786769 900893799739313404 1713356161602321312 1498716226427684952 1891127250952862400 434535224302100866 563314469565016655 48801962783937543 815241051524964792 1271059178843143421 1155942579006739581 1195215598942183217 1509062713599569278 817625600051431725 1040712058710134845 967966441255911659 866693424614588590 905753750095118643 769356372238862419 1709848785158659059 
+26 27 21 1176681763177565772 2103848862621176329 901493048284410359 1612457940850764681 378728962122864379 228069018927986129 174383950353526755 1462129049631723590 1871073403144232981 1523093074134329536 1969434159183639217 921145095224827540 628134549097650809 222984036347229090 2186282770584086815 874884720726543826 477266645103905534 172294663435967518 2062802020331168030 2042888978914047022 158209604361007190 1277960822082219373 
+27 27 18 511030575614183531 1761788260764456818 1007391171649933503 1759664150036172675 601617807316952775 1137114770891248917 1538478537966398260 1952489395159535989 460437134790856021 2000685555346586753 1168348473447836529 793198217180888845 670418197748043050 1772506354647799619 951780435459460433 1512792286964895933 2145143959207357191 658770707514398416 525622497664088815 
+28 27 9 384500374692754803 1897804185124719681 2101709759950808655 1367575113118813366 1129272575252916860 1781272419456884216 1232470826439429812 737713478047817428 745686997923565074 232557642022901832 
+27 28 9 1952865232740458586 679580899375470920 306339999087635406 337074295530784596 2183302732917702101 152370140520677931 524106184759315531 963749951943328768 196748706728517402 1920978801073212888 
+28 28 12 2302079822692532778 908666242518905424 2070405392661832873 54509453903415710 494783064131870443 1375312131538626717 1458186872199188464 1744911312536373366 1509149975710166231 1785167366530798532 200724588859164721 1040198047939953555 1995066072633194454 
+29 28 9 253212071487287623 2010279151679155802 1792024378963291421 1127483625025678093 1308675810686726915 953885526112601763 9259892529818852 560018921939439877 1476204682798164033 788364840352155869 
+28 29 9 876333677487055999 358339257701620191 332030918360528734 1058549896121995212 424997003050731377 1490048296232078048 1339956259587336150 558473557351448442 843432374625539923 1981296408094057801 
+29 29 6 254507651357863214 1877975338936549168 782631888670531666 1094593059454459574 46964544611254840 670055313699127473 1334522284338662881 
+
Index: testVarieties/polinomial.hpp
===================================================================
--- testVarieties/polinomial.hpp	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
+++ testVarieties/polinomial.hpp	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
@@ -0,0 +1,78 @@
+#include "polynomial.h"
+//using namespace pol;
+template <unsigned KEY_DEG>
+
+void encrypt(File &in, FILE *out, const pol3v_t &D) {
+	std::vector<u61_t> m;
+	u61_t buf;
+	u64_t size = 0, block_size;
+	while (block_size = in.read(buf), block_size) {
+		m.push_back(buf);
+		size += block_size;
+	}
+	block512_t h = hash_nm::hash((char *)(m.data()), m.size() * sizeof(u61_t));
+	fwrite(&h, sizeof(h), 1, out);
+	u64_t max_deg = (m.size() - 1) / KEY_DEG + 2;
+	pol3v_t f = XXX_get_f(max_deg, KEY_DEG);
+	pol3v_t mes = XXX_get_mes(max_deg, KEY_DEG, size, m);
+	(mes += f * D.get_same_rand_pol() + D * f.get_same_rand_pol()).write(out, TEXTPR);
+	(mes += f * D.get_same_rand_pol() + D * f.get_same_rand_pol()).write(out, TEXTPR);
+}
+
+template <unsigned CLOSE_KEY_DEG, unsigned OPEN_KEY_DEG>
+void decrypt(FILE *in, File &out, const pol_t &x, const pol_t &y) {
+	block512_t h1, h2;
+	fread(&h1, sizeof(h1), 1, in);
+	pol3v_t tmp;
+	tmp.read(in, TEXTPR);
+	pol_t m, m1, fc, pol_x = get_x(), kxy = x * y;
+	m1 = tmp.subst(x, y);
+	tmp.read(in, TEXTPR);
+	fc = tmp.subst(x, y) - m1;
+	vector_t factor;
+	fc.fact(CLOSE_KEY_DEG * OPEN_KEY_DEG * 2 + 1, factor);
+	XXX_get_fact(factor, CLOSE_KEY_DEG * OPEN_KEY_DEG * 2 + 1, factor);
+	std::vector<u61_t> res;
+	u61_t a = x[CLOSE_KEY_DEG].inverse() * y[CLOSE_KEY_DEG].inverse();
+	for (u32_t j = 0; j < factor.size(); ++j) {
+		res.clear();
+		m = m1 % (fc / factor[j]);
+		u32_t deg = m.get_deg();
+		u64_t size = m[deg] * a.pow(deg / (2 * CLOSE_KEY_DEG));
+		m %= kxy.pow(deg / (2 * CLOSE_KEY_DEG)) * pol_x.pow(deg % (2 * CLOSE_KEY_DEG));
+		deg = m.get_deg();
+		for (u32_t i = 0; i <= deg; ++i) {
+			res.push_back(m[deg - i] * a.pow((deg - i) / (2 * CLOSE_KEY_DEG)));
+			m %= kxy.pow((deg - i) / (2 * CLOSE_KEY_DEG)) * pol_x.pow((deg - i) % (2 * CLOSE_KEY_DEG));
+		}
+		block512_t h2 = hash_nm::hash((char *)(res.data()), res.size() * sizeof(u61_t));
+		if (h1 == h2) {
+//			for (u32_t i = 0; i < res.size(); ++i) {
+//				if (size > MODSIZE - 1) {
+//					size -= out.write(res[i]);
+//				}
+//				else {
+//					size -= out.write(res[i], size);
+//				}
+//			}
+			out.flush();
+			break;
+		}
+	}
+}
+
+template <unsigned CLOSE_KEY_DEG, unsigned OPEN_KEY_DEG>
+   pol3v_t get_open_key(const pol_t &x, const pol_t &y) {
+	polmap_t tmp;
+	pol3v_t tmp2;
+	for (u32_t i = 1; i <= OPEN_KEY_DEG; ++i) {
+		tmp.insert(pol3v1_t(deg_t(i, i), get_rand_pol(2 * (OPEN_KEY_DEG - i) * CLOSE_KEY_DEG + 1, false)));
+	}
+	tmp.insert(pol3v1_t(deg_t(OPEN_KEY_DEG - 1, OPEN_KEY_DEG), get_rand_pol(1 + CLOSE_KEY_DEG, false)));
+	tmp.insert(pol3v1_t(deg_t(OPEN_KEY_DEG, OPEN_KEY_DEG - 1), get_rand_pol(1 + CLOSE_KEY_DEG, false)));
+	tmp.insert(pol3v1_t(deg_t(0, 1), get_rand_pol(CLOSE_KEY_DEG * (2 * OPEN_KEY_DEG - 1) + 1, false)));
+	tmp.insert(pol3v1_t(deg_t(1, 0), get_rand_pol(CLOSE_KEY_DEG * (2 * OPEN_KEY_DEG - 1) + 1, false)));
+	tmp2 = tmp;
+	tmp.insert(pol3v1_t(deg_t(0, 0), pol_t() - tmp2.subst(x, y)));
+	return tmp;
+}
Index: testVarieties/polynomial.cpp
===================================================================
--- testVarieties/polynomial.cpp	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
+++ testVarieties/polynomial.cpp	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
@@ -0,0 +1,956 @@
+// polynomial.cpp
+
+#define _CRT_SECURE_NO_WARNINGS
+
+#include "polynomial.h"
+#include <array>
+#include <map>
+#include <cstdio>
+
+using namespace pol;
+
+u61_t::u61_t(u64_t x):
+	data(x % MOD) {
+}
+inline u61_t::operator pol::u64_t() const {
+	return data;
+}
+inline u61_t u61_t::operator+(const u61_t &x) const {
+	return (data + x.data) % MOD;
+}
+inline u61_t u61_t::operator-(const u61_t &x) const {
+	return (data + MOD - x.data) % MOD;
+}
+u61_t u61_t::operator*(const u61_t &x) const {
+//#pragma warning(push)
+//#pragma warning(disable:4127)
+	if (BUFSIZE > 4) {
+//#pragma warning(pop)
+		u64_t h1 = data >> 32, h2 = x.data >> 32, l1 = data & M32, l2 = x.data & M32;
+		u64_t bot = l1 * l2;
+		u64_t mid = h1 * l2 + h2 * l1 + (bot >> 32);
+		bot = (mid << 32) + (bot & M32);
+		u64_t top = ((h1 * h2 + (mid >> 32)) << (64 - MODSIZE)) + (bot >> MODSIZE);
+		return (top + (bot & MOD)) % MOD;
+	} else {
+		return data * x.data % MOD;
+	}
+}
+u61_t u61_t::operator/(const u61_t &x) const {
+	return *this * (x.inverse());
+}
+u61_t u61_t::inverse() const {
+	if (!data) {
+		throw "Invalid inverse\n";
+	}
+	u64_t a = MOD, b = data, r;
+	std::array<u64_t, 64> q;
+	q[0] = 1;
+	u32_t i = 0;
+	do {
+		++i;
+		r = a % b;
+		q[i] = a / b;
+		a = b; b = r;
+	} while (r);
+	for (u32_t j = 2; j < i; ++j) {
+		q[j] = q[j] * q[j - 1] + q[j - 2];
+	}
+
+	if (i & 1) {
+		return u61_t(q[i - 1]);
+	} else {
+		return u61_t(MOD - q[i - 1]);
+	}
+}
+u61_t& u61_t::operator+=(const u61_t &x) {
+	return *this = *this + x;
+}
+u61_t& u61_t::operator-=(const u61_t &x) {
+	return *this = *this - x;
+}
+u61_t& u61_t::operator*=(const u61_t &x) {
+	return *this = *this * x;
+}
+u61_t& u61_t::operator/=(const u61_t &x) {
+	return *this = *this / x;
+}
+inline u64_t* u61_t::get_addr() {
+	return &data;
+}
+inline const u64_t* u61_t::get_addr() const {
+	return &data;
+}
+inline u64_t& u61_t::get_buf() {
+	return data;
+}
+inline const u64_t& u61_t::get_buf() const {
+	return data;
+}
+void u61_t::print(FILE *fout, u32_t i) const {
+	if ((i > 0 && data != 1) || !i) {
+		fprintf(fout, "%llu", data);
+	}
+	if (i > 1) {
+		fprintf(fout, "t<sup>%u</sup>", i);
+	} else if (i == 1) {
+		fprintf(fout, "t");
+	}
+}
+u61_t u61_t::pow(u32_t p) const {
+	u61_t res, tmp = *this;
+	res = 1;
+	while (p > 0) {
+		if (p & 1) {
+			res *= tmp;
+		}
+		p /= 2;
+		tmp *= tmp;
+	}
+	return res;
+}
+
+pol_t::pol_t():
+	data(1),
+	degree(0)
+{
+	data[0] = 0;
+}
+void pol_t::change_degree(u32_t ndegree) {
+	degree = ndegree;
+	data.resize(degree + 1);
+	for (u32_t i = 0; i <= degree; ++i) {
+		data[i] = 0;
+	}
+}
+pol_t& pol_t::operator=(const pol_t &x) {
+	if (&x != this) {
+		change_degree(x.degree);
+		for (u32_t i = 0; i <= degree; ++i) {
+			data[i] = x[i];
+		}
+	}
+	return *this;
+}
+u61_t& pol_t::operator[](u32_t i) {
+	if (i > degree) {
+		throw "Out of array bound";
+	}
+	return data[i];
+}
+const u61_t& pol_t::operator[](u32_t i) const {
+	if (i > degree) {
+		throw "Out of array bound";
+	}
+	return data[i];
+}
+u64_t& pol_t::operator()(u32_t i) {
+	if (i > degree) {
+		throw "Out of array bound";
+	}
+	return data[i].get_buf();
+}
+const u64_t& pol_t::operator()(u32_t i) const {
+	if (i > degree) {
+		throw "Out of array bound";
+	}
+	return data[i].get_buf();
+}
+inline u32_t pol_t::get_deg() const {
+	return degree;
+}
+pol_t pol_t::operator+(const pol_t &x) const{
+	pol_t tmp;
+	u32_t tempdeg;
+	if (degree < x.degree) {
+		tempdeg = x.degree;
+	} else {
+		tempdeg = degree;
+	}
+	tmp.change_degree(tempdeg);
+	for (u32_t i = 0; i <= degree; ++i) {
+		tmp[i] = data[i];
+	}
+	for (u32_t i = 0; i <= x.degree; ++i) {
+		tmp[i] += x[i];
+	}
+	while (tmp.degree > 0 && !tmp[tmp.degree]) {
+		--(tmp.degree);
+	}
+	return tmp;
+}
+pol_t pol_t::operator-(const pol_t &x) const {
+	pol_t tmp;
+	u32_t tempdeg;
+	if (degree < x.degree) {
+		tempdeg = x.degree;
+	} else {
+		tempdeg = degree;
+	}
+	tmp.change_degree(tempdeg);
+	for (u32_t i = 0; i <= degree; ++i) {
+		tmp[i] = data[i];
+	}
+	for (u32_t i = 0; i <= x.degree; ++i) {
+		tmp[i] -= x[i];
+	}
+	while (tmp.degree > 0 && !tmp[tmp.degree]) {
+		--(tmp.degree);
+	}
+	return tmp;
+}
+pol_t pol_t::operator*(const pol_t &x) const {
+	pol_t tmp;
+	tmp.change_degree(degree + x.degree);
+	for (u32_t i = 0; i <= degree; ++i) {
+		for (u32_t j = 0; j <= x.degree; ++j) {
+			tmp[i + j] += data[i] * x[j];
+		}
+	}
+	while (tmp.degree > 0 && !tmp[tmp.degree]) {
+		--tmp.degree;
+	}
+	return tmp;
+}
+pol_t pol_t::operator%(const pol_t &x) const {
+	if (!x) {
+		throw "Polinomial denominator = 0";
+	}
+	pol_t tmp = *this;
+	if (!x.degree) {
+		return pol_t();
+	} else {
+		u61_t inv = x[x.degree].inverse();
+		for (u32_t i = tmp.degree; i >= x.degree; --i) {
+			u61_t q = tmp[i] * inv;
+			for (u32_t j = 0; j <= x.degree; ++j) {
+				tmp[i - j] -= x[x.degree - j] * q;
+			}
+		}
+		while (tmp.degree > 0 && !tmp[tmp.degree]) {
+			--tmp.degree;
+		}
+		return tmp;
+	}
+}
+pol_t pol_t::operator/(const pol_t &x) const {
+	if (!x) {
+		throw "Polinomial devision by 0";
+	} else if (x.degree > degree) {
+		return pol_t();
+	} else if (x.degree) {
+		pol_t tmp = *this, res;
+		res.change_degree(tmp.degree - x.degree);
+		u61_t q = x[x.degree].inverse();
+		for (u32_t i = tmp.degree; i >= x.degree; --i) {
+			res[i - x.degree] = tmp[i] * q;
+			for (u32_t j = 0; j <= x.degree; ++j) {
+				tmp[i - j] -= x[x.degree - j] * res[i - x.degree];
+			}
+		}
+		return res;
+	} else {
+		pol_t res = *this;
+		u61_t q = x[0].inverse();
+		for (u32_t i = 0; i <= res.degree; ++i) {
+			res[i] *= q;
+		}
+		return res;
+	}
+}
+pol_t& pol_t::operator+=(const pol_t&x) {
+	return *this = *this + x;
+}
+pol_t& pol_t::operator-=(const pol_t&x) {
+	return *this = *this - x;
+}
+pol_t& pol_t::operator*=(const pol_t&x) {
+	return *this = *this * x;
+}
+pol_t& pol_t::operator%=(const pol_t&x) {
+	return *this = *this % x;
+}
+pol_t& pol_t::operator/=(const pol_t&x) {
+	return *this = *this / x;
+}
+pol_t::operator bool() const {
+	return degree || data[0];
+}
+bool pol_t::operator==(const pol_t &x) const {
+	if (x.degree != degree) {
+		return false;
+	} else {
+		for (u32_t i = 0; i <= degree; ++i) {
+			if (data[i] != x(i)) {
+				return false;
+			}
+		}
+	}
+	return true;
+}
+pol_t pol_t::pow(u32_t p) const {
+	pol_t res, tmp = *this;
+	res(0) = 1;
+	while (p > 0) {
+		if (p & 1) {
+			res *= tmp;
+		}
+		p /= 2;
+		tmp *= tmp;
+	}
+	return res;
+}
+pol_t pol_t::mpow(u64_t p, const pol_t &m) const {
+	pol_t res, tmp = *this % m;
+	res(0) = 1;
+	while (p > 0) {
+		if (p & 1) {
+			res = res * tmp % m;
+		}
+		p /= 2;
+		tmp = tmp * tmp % m;
+	}
+	return res;
+}
+pol_t pol_t::mpow(u64_t p, u64_t d, const pol_t &m) const {
+	pol_t tmp = mpow((p - 1) / 2, m), res;
+	res[0] = 1;
+	for (u64_t i = 0; i < d; ++i) {
+		res = res * tmp % m;
+		tmp = tmp.mpow(p, m);
+	}
+	return res;
+}
+pol_t pol_t::normalize() const {
+	pol_t res = *this;
+	u61_t q = data[degree].inverse();
+	for (u32_t i = 0; i <= degree; ++i) {
+		res[i] *= q;
+	}
+	return res;
+}
+pol_t pol_t::deriv() const{
+	pol_t res;
+	if (degree) {
+		res.change_degree(degree - 1);
+		for (u32_t i = degree; i > 0; --i) {
+			res[i - 1] = u61_t(i) * data[i];
+		}
+	}
+	while (res.degree > 0 && !res[res.degree]) {
+		--res.degree;
+	}
+	return res;
+}
+
+void pol_t::read(FILE *fin, pol_format_t format) {
+	degree = 0;
+	switch (format)
+	{
+	case BINPR:
+		std::fread(&degree, 1, 1, fin);
+		if (degree > 256) {
+			throw "Incorrect polynomial degree";
+		}
+		data.resize(degree + 1);
+		for (u32_t i = 0; i <= degree; ++i) {
+			u64_t buf;
+			std::fread(&buf, BUFSIZE, 1, fin);
+			if (buf >= MOD) {
+				throw "Incorrect polinomial coefficient";
+			}
+			data[i] = buf;
+		}
+		break;
+	case TEXTPR:
+		std::fscanf(fin, "%u", &degree);
+		if (degree > 256) {
+			throw "Incorrect polynomial degree";
+		}
+		data.resize(degree + 1);
+		for (u32_t i = 0; i <= degree; ++i) {
+			u64_t buf;
+			std::fscanf(fin, "%llu", &buf);
+			if (buf >= MOD) {
+				throw "Incorrect polinomial coefficient";
+			}
+			data[i] = buf;
+		}
+		break;
+	case HTMLPR:
+		break;
+	default:
+		break;
+	}
+}
+void pol_t::write(FILE *fout, pol_format_t format, bool eol) const {
+	switch (format)
+	{
+	case pol::BINPR:
+		fwrite(&degree, 1, 1, fout);
+		for (u32_t i = 0; i <= degree; ++i) {
+			fwrite(data[i].get_addr(), BUFSIZE, 1, fout);
+		}
+		break;
+	case pol::TEXTPR:
+		fprintf(fout, "%u ", degree);
+		for (u32_t i = 0; i <= degree; ++i) {
+			fprintf(fout, "%llu ", data[i].get_buf());
+		}
+		if (eol) fprintf(fout, "\n");
+		break;
+	case pol::HTMLPR:
+		{
+			u32_t i = degree;
+			u32_t min = 0;
+			while (min < degree && !data[min]) ++min;
+			--min;
+			data[i].print(fout, i);
+			--i;
+			for (; i != min; --i) {
+				if (data[i]) {
+					fprintf(fout, " + ");
+					data[i].print(fout, i);
+				}
+			}
+			if (eol) fprintf(fout, "<br>");
+		}
+		break;
+	default:
+		break;
+	}
+}
+void pol_t::ddf(u32_t max_deg, vector_t &res) const {
+	pol_t v = *this, x = get_x(), xp = x, tmp;
+	res.resize(max_deg + 1);
+	for (u32_t i = 0; i <= max_deg; ++i) {
+		res[i](0) = 1;
+	}
+	u32_t i = 1;
+	for (; i <= max_deg; ++i)  {
+		xp = xp.mpow(MOD, v);
+		tmp = gcd(xp - x, v);
+		if (tmp.degree > 0) {
+			res[i] = tmp;
+			v /= tmp;
+		}
+		fprintf(stderr, "%d of %d\n", i, max_deg);
+	}
+	res[0] = v;
+}
+void pol_t::split(u32_t deg, vector_t &res) const {
+	u32_t count = degree / deg, found = 0;
+	pol_t r_pol, r_gcd, unit;
+	unit[0] = 1;
+	std::list<pol_t> l1, l2;
+	l1.push_back(*this);
+	std::list<pol_t> *cur = &l1, *next = &l2;
+	while (found < count) {
+		r_pol = get_rand_pol(deg);
+		next->clear();
+		for (auto i = cur->begin(), end = cur->end(); i != end; ++i) {
+			if (i->degree == deg) {
+				res.push_back(*i);
+				++found;
+			} else {
+				r_gcd = gcd(r_pol.mpow(MOD, deg, *i) - unit, *i);
+				if (r_gcd.degree && r_gcd.degree < i->degree) {
+					*i /= r_gcd;
+					if (i->degree == deg) {
+						res.push_back(*i);
+						++found;
+					}
+					else {
+						next->push_back(*i);
+					}
+					if (r_gcd.degree == deg) {
+						res.push_back(r_gcd);
+						++found;
+					}
+					else {
+						next->push_back(r_gcd);
+					}
+				}
+				else {
+					next->push_back(*i);
+				}
+			}
+		}
+		std::swap(cur, next);
+	}
+}
+void pol_t::fact(u32_t max_deg, vector_t &res) const {
+	pol_t d = gcd(deriv(), *this), tmp;
+	if (d.degree) {
+		tmp = *this / d;
+	} else {
+		tmp = *this;
+	}
+	std::vector<pol_t> ddf_pol;
+	tmp.ddf(max_deg, ddf_pol);
+	for (u32_t i = 1; i <= max_deg; ++i) {
+		if (ddf_pol[i].degree > 0) {
+			ddf_pol[i].split(i, res);
+		}
+	}
+	if (d.degree) {
+		for (size_t i = 0, size = res.size(); i < size && d.degree; ++i) {
+			while (!(d % res[i])) {
+				res.push_back(res[i]);
+				d /= res[i];
+			}
+		}
+	}
+}
+
+deg_t::deg_t() : key(0) {}
+deg_t::deg_t(u32_t a, u32_t b) :
+	x(a),
+	y(b)
+{
+}
+bool deg_t::operator<(const deg_t &deg) const{
+	return key < deg.key;
+}
+bool deg_t::operator==(const deg_t &deg) const{
+	return key == deg.key;
+}
+deg_t deg_t::operator+(const deg_t &deg) const {
+	return deg_t(x + deg.x, y + deg.y);
+}
+
+pol3v_t::pol3v_t() {
+	data.clear();
+	data.push_back(pol3v1_t());
+	dx = 0; dy = 0; dt = 0;
+}
+pol3v_t::pol3v_t(const polmap_t &m) :
+	data(),
+	dx(0),
+	dy(0),
+	dt(0)
+{
+	data.clear();
+	bool empty = true;
+	for (auto i = m.begin(); i != m.end(); ++i) {
+		if (i->second) {
+			if (empty) {
+				empty = false;
+			}
+			data.push_back(*i);
+			if (dx < i->first.x) dx = i->first.x;
+			if (dy < i->first.y) dy = i->first.y;
+			if (dt < i->second.get_deg()) dt = i->second.get_deg();
+		}
+	}
+	if (empty) {
+		data.push_back(pol3v1_t());
+	}
+}
+pol3v_t& pol3v_t::operator=(const pol3v_t &x) {
+	if (&x != this) {
+		data.clear();
+		data = x.data;
+		dx = x.dx; dy = x.dy; dt = x.dt;
+	}
+	return *this;
+}
+pol3v_t pol3v_t::operator+(const pol3v_t &x) const {
+	polmap_t tmp;
+	for (auto i = data.begin(); i != data.end(); ++i) {
+		if (tmp.find(i->first) == tmp.end()) {
+			tmp.insert(*i);
+		} else {
+			tmp[i->first] += i->second;
+		}
+	}
+	for (auto i = x.data.begin(); i != x.data.end(); ++i) {
+		if (tmp.find(i->first) == tmp.end()) {
+			tmp.insert(*i);
+		} else {
+			tmp[i->first] += i->second;
+		}
+	}
+	return tmp;
+}
+pol3v_t pol3v_t::operator-(const pol3v_t &x) const {
+	polmap_t tmp;
+	for (auto i = data.begin(); i != data.end(); ++i) {
+		if (tmp.find(i->first) == tmp.end()) {
+			tmp.insert(*i);
+		} else {
+			tmp[i->first] += i->second;
+		}
+	}
+	for (auto i = x.data.begin(); i != x.data.end(); ++i) {
+		if (tmp.find(i->first) == tmp.end()) {
+			tmp.insert(pol3v1_t(i->first, pol_t() - i->second));
+		} else {
+			tmp[i->first] -= i->second;
+		}
+	}
+	return tmp;
+}
+pol3v_t pol3v_t::operator*(const pol3v_t &x) const {
+	polmap_t tmp;
+	for (auto i = data.begin(); i != data.end(); ++i) {
+		for (auto j = x.data.begin(); j != x.data.end(); ++j) {
+			if (tmp.find(i->first + j->first) == tmp.end()) {
+				tmp.insert(pol3v1_t(i->first + j->first, i->second * j->second));
+			} else {
+				tmp[i->first + j->first] += i->second * j->second;
+			}
+		}
+	}
+	return tmp;
+}
+pol3v_t& pol3v_t::operator+=(const pol3v_t &x) {
+	return *this = *this + x;
+}
+pol3v_t& pol3v_t::operator-=(const pol3v_t &x) {
+	return *this = *this - x;
+}
+pol3v_t& pol3v_t::operator*=(const pol3v_t &x) {
+	return *this = *this * x;
+}
+pol_t pol3v_t::subst(const pol_t &x, const pol_t &y) const {
+	pol_t res;
+	for (auto i = data.begin(), end = data.end(); i != end; ++i) {
+		res += x.pow(i->first.x) * y.pow(i->first.y) * i->second;
+	}
+	return res;
+}
+pol3v_t pol3v_t::get_same_rand_pol() const {
+	pol3v_t res = *this;
+	for (auto i = res.data.begin(), end = res.data.end(); i != end; ++i) {
+		i->second = get_rand_pol(i->second.get_deg(), false);
+	}
+	return res;
+}
+void pol3v_t::read(FILE *fin, pol_format_t format) {
+	size_t count = 0;
+	data.clear();
+	switch (format)
+	{
+	case BINPR:
+	{
+		std::fread(&count, 1, sizeof(count), fin);
+		if (!count) {
+			data.push_back(pol3v1_t());
+			dx = 0; dy = 0; dt = 0;
+		}
+		deg_t deg;
+		for (size_t i = 0; i < count; ++i) {
+			std::fread(&(deg.key), sizeof(deg.key), 1, fin);
+			pol_t tmp;
+			tmp.read(fin, BINPR);
+			if (tmp) {
+				data.push_back(pol3v1_t(deg, tmp));
+				if (deg.x > dx) dx = deg.x;
+				if (deg.y > dy) dy = deg.y;
+				if (tmp.get_deg() > dt) dt = tmp.get_deg();
+			}
+		}
+		break;
+	}
+	case TEXTPR:
+		std::fscanf(fin, "%zu", &count);
+		if (!count) {
+			data.clear();
+			data.push_back(pol3v1_t());
+			dx = 0; dy = 0; dt = 0;
+		} else {
+			for (size_t i = 0; i < count; ++i) {
+				u32_t v[2];
+				fscanf(fin, "%u%u", v, v + 1);
+				pol_t tmp;
+				tmp.read(fin, TEXTPR);
+				if (tmp) {
+					data.push_back(pol3v1_t(deg_t(v[0], v[1]), tmp));
+					if (v[0] > dx) dx = v[0];
+					if (v[1] > dy) dy = v[1];
+					if (tmp.get_deg() > dt) dt = tmp.get_deg();
+				}
+			}
+		}
+		break;
+	case HTMLPR:
+		break;
+	default:
+		break;
+	}
+}
+void pol3v_t::write(FILE *fout, pol_format_t format, bool eol) const {
+	size_t count = data.size();
+	switch (format)
+	{
+	case pol::BINPR:
+		std::fwrite(&count, 1, sizeof(count), fout);
+		for (auto i = data.begin(), end = data.end(); i != end; ++i) {
+			std::fwrite(&(i->first.key), sizeof(i->first.key), 1, fout);
+			i->second.write(fout, BINPR);
+		}
+		break;
+	case TEXTPR:
+		std::fprintf(fout, "%zu\n", count);
+		for (auto i = data.begin(), end = data.end(); i != end; ++i) {
+			fprintf(fout, "%u %u ", i->first.x, i->first.y);
+			i->second.write(fout, TEXTPR, true);
+		}
+		if (eol) {
+			fprintf(fout, "\n");
+		}
+		break;
+	case pol::HTMLPR:
+		if (!count) {
+			fprintf(fout, "0");
+		} else {
+			auto i = data.rbegin();
+			if (i->first.x > 1) {
+				fprintf(fout, "x<sup>%u</sup>", i->first.x);
+			}
+			else if (i->first.x == 1) {
+				fprintf(fout, "x");
+			}
+			if (i->first.y > 1) {
+				fprintf(fout, "y<sup>%u</sup>", i->first.y);
+			}
+			else if (i->first.y == 1) {
+				fprintf(fout, "y");
+			}
+			fprintf(fout, "(");
+			i->second.write(fout, HTMLPR);
+			fprintf(fout, ")");
+			++i;
+			for (auto end = data.rend(); i != end; ++i) {
+				fprintf(fout, " + ");
+				if (i->first.x > 1) {
+					fprintf(fout, "x<sup>%u</sup>", i->first.x);
+				}
+				else if (i->first.x == 1) {
+					fprintf(fout, "x");
+				}
+				if (i->first.y > 1) {
+					fprintf(fout, "y<sup>%u</sup>", i->first.y);
+				}
+				else if (i->first.y == 1) {
+					fprintf(fout, "y");
+				}
+				fprintf(fout, "(");
+				i->second.write(fout, HTMLPR);
+				fprintf(fout, ")");
+			}
+		}
+		if (eol) {
+			fprintf(fout, "<br>");
+		}
+		break;
+	default:
+		break;
+	}
+}
+
+File::File() :
+	file(NULL),
+	opened(false),
+	mode(READ),
+	buf(0),
+	pos(0),
+	count(0)
+{
+}
+File::File(FILE *_file, file_mode_t m) :
+file(_file),
+opened(false),
+mode(m),
+buf(0),
+pos(0),
+count(0)
+{
+}
+File::File(const char *file_name, file_mode_t m) :
+file(NULL),
+opened(false),
+mode(m),
+buf(0),
+pos(0),
+count(0)
+{
+	if (!open(file_name, m)) {
+		throw "Can't open the file";
+	}
+}
+File::~File() {
+	close();
+}
+bool File::open(const char *file_name, file_mode_t m) {
+	if ((mode = m) == READ) {
+		file = fopen(file_name, "rb");
+	} else {
+		file = fopen(file_name, "wb");
+	}
+	return opened = !!(file);
+}
+void File::close() {
+	if (opened) {
+		flush();
+		fclose(file);
+		opened = false;
+		mode = READ;
+	}
+}
+void File::flush() {
+	if (mode == WRITE && count) {
+		buf = (buf >> pos) & ((1ull << count) - 1);
+		fwrite(&buf, 1, (count - 1) / 8 + 1, file);
+	}
+	count = 0;
+	pos = 0;
+	buf = 0;
+}
+size_t File::read(u61_t &block) {
+	if (mode != READ || !opened) {
+		throw "Incorrect read";
+	}
+	u64_t res = 0;
+	size_t cur = 0;
+	if (count) {
+		res = (buf >> pos) & ((1ull << MODSIZE) - 1) & ((1ull << count) - 1);
+		cur = count < MODSIZE ? count : MODSIZE;
+	}
+	if (cur < MODSIZE) {
+		buf = 0;
+		count = 8 * fread(&buf, 1, (MODSIZE - cur - 1) / 8 + 1, file);
+		read_size += count / 8;
+		res |= (buf << cur) & ((1ull << MODSIZE) - 1);
+	}
+	if (res >= MOD || (res < (1ull << (MODSIZE - 1)))) {
+		res &= (1ull << (MODSIZE - 1)) - 1;
+		if (count > MODSIZE - 1 - cur) {
+			count -= MODSIZE - 1 - cur;
+			pos = MODSIZE - 1 - cur;
+			cur = MODSIZE - 1;
+		} else {
+			cur += count;
+			count = 0;
+		}
+	} else {
+		count -= MODSIZE - cur;
+		pos = MODSIZE - cur;
+		cur = MODSIZE;
+	}
+	block = res;
+	return cur;
+}
+size_t File::write(const u61_t &block, size_t block_size) {
+	if (mode != WRITE || !opened) {
+		throw "Incorrect write";
+	}
+	u64_t tmp = block;
+	size_t size;
+	if (tmp >= (1ull << (MODSIZE - 1))) {
+		size = MODSIZE;
+	} else {
+		size = block_size;
+	}
+	if (!count) {
+		buf = 0;
+	}
+	buf |= tmp << count;
+	if (size + count >= 8 * sizeof(buf)) {
+		fwrite(&buf, 1, sizeof(buf), file);
+	}
+	if (size + count > 8 *sizeof(buf)) {
+		buf = tmp >> (sizeof(buf)* 8 - count);
+	}
+	count = (size + count) % (8 * sizeof(buf));
+	return size;
+}
+
+random_t::random_t() :
+	generator(std::time(NULL))
+{
+}
+u61_t random_t::operator()() {
+	return u64_t((generator() - 1.) / generator.max() * MOD);
+}
+
+pol_t pol::gcd(const pol_t &x, const pol_t &y) {
+	pol_t a = x, b = y, q;
+	while (q = a % b, q) {
+		a = b;
+		b = q;
+	}
+	return b.normalize();
+}
+pol_t pol::get_x() {
+	pol_t res;
+	res.change_degree(1);
+	res[1] = 1;
+	return res;
+}
+
+pol_t pol::get_rand_pol(u32_t deg, bool flag) {
+	static random_t get_coef;
+	pol_t res;
+	res.change_degree(deg);
+	//res[deg] = flag ? 1 : get_coef();
+	while (!res(deg)) {
+		res[deg] = get_coef();
+	}
+	for (u32_t i = 0; i < deg; ++i) {
+		res[i] = get_coef();
+	}
+	return res;
+}
+
+pol3v_t pol::XXX_get_f(const u64_t max_deg, const u32_t key_deg) {
+	polmap_t tmp;
+	for (u32_t i = 0; i <= max_deg; ++i) {
+		tmp.insert(pol3v1_t(deg_t(i, i), get_rand_pol(key_deg - 1)));
+	}
+	return tmp;
+}
+pol3v_t pol::XXX_get_mes(const u64_t max_deg, const u32_t key_deg, const u64_t size, const std::vector<u61_t> &m) {
+	polmap_t tmp;
+	pol_t tmp2;
+	u64_t block_count = m.size();
+	tmp2.change_degree(key_deg - 1);
+	for (u32_t i = 0; i < max_deg; ++i) {
+		for (u32_t j = 0; j < key_deg; ++j) {
+			if (i * key_deg + j < block_count) {
+				tmp2[j] = m[block_count - 1 - (i * key_deg + j)];
+			}
+			else {
+				tmp2(j) = 0;
+			}
+		}
+		tmp.insert(pol3v1_t(deg_t(i, i), tmp2));
+	}
+	tmp2.change_degree(0);
+	tmp2[0] = size;
+	tmp.insert(pol3v1_t(deg_t(u32_t(max_deg), u32_t(max_deg)), tmp2));
+	return tmp;
+}
+void pol::XXX_get_fact(const vector_t &fact, u64_t deg, vector_t &res) {
+	size_t num = fact.size();
+	std::vector<std::list<pol_t>> tmp;
+	tmp.resize(deg + 1);
+	for (size_t i = 0; i < num; ++i) {
+		u32_t pol_deg = fact[i].get_deg();
+		for (auto j = tmp.rbegin(); j != tmp.rend(); ++j) {
+			for (auto it = j->begin(); it != j->end(); ++it) {
+				if (pol_deg + it->get_deg() <= deg) {
+					tmp[pol_deg + it->get_deg()].push_back(fact[i] * *it);
+				}
+			}
+		}
+		if (pol_deg <= deg) {
+			tmp[pol_deg].push_back(fact[i]);
+		}
+	}
+	res.clear();
+	for (auto i = tmp[deg].begin(); i != tmp[deg].end(); ++i) {
+		res.push_back(*i);
+	}
+}
Index: testVarieties/polynomial.h
===================================================================
--- testVarieties/polynomial.h	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
+++ testVarieties/polynomial.h	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
@@ -0,0 +1,179 @@
+// polynomial.h
+
+#pragma once
+
+#include <cstdio>
+#include <utility>
+#include <vector>
+#include <map>
+#include <list>
+#include <random>
+#include <ctime>
+#include "hash.h"
+
+namespace pol {
+
+	typedef unsigned long long u64_t;
+	typedef unsigned u32_t;
+	typedef unsigned char u8_t;
+
+	const u32_t POL1V_MAXLENGTH = 4096;
+	const u32_t M32 = 0xffffffff;
+	const u32_t KEY_DEG = 3;
+	const u32_t MODSIZE = 61;
+	const u32_t BUFSIZE = 8;
+	const u64_t MOD = 2305843009213693951; // 2147483647; //  // 2^61 - 1
+
+	class u61_t {
+	private:
+		u64_t data;
+	public:
+		u61_t(u64_t x = 0);
+		 operator u64_t() const;
+		 u61_t operator+(const u61_t &) const;
+	    u61_t operator-(const u61_t &) const;
+		u61_t operator*(const u61_t &) const;
+		u61_t operator/(const u61_t &) const;
+		u61_t& operator+=(const u61_t &);
+		u61_t& operator-=(const u61_t &);
+		u61_t& operator*=(const u61_t &);
+		u61_t& operator/=(const u61_t &);
+		u61_t inverse() const;
+		u61_t pow(u32_t) const;
+		inline u64_t* get_addr();
+		inline const u64_t* get_addr() const;
+		inline u64_t& get_buf();
+		inline const u64_t& get_buf() const;
+		void print(FILE *, u32_t) const;
+	};
+
+	enum pol_format_t {
+		BINPR,
+		TEXTPR,
+		HTMLPR
+	};
+
+	class pol_t {
+	private:
+		std::vector<u61_t> data;
+		u32_t degree;
+	public:
+		typedef std::vector<pol_t> vector_t;
+		pol_t();
+		pol_t& operator=(const pol_t&);
+		void change_degree(u32_t);
+		pol_t& operator+=(const pol_t&);
+		pol_t& operator-=(const pol_t&);
+		pol_t& operator*=(const pol_t&);
+		pol_t& operator%=(const pol_t&);
+		pol_t& operator/=(const pol_t&);
+		pol_t operator+(const pol_t&) const;
+		pol_t operator-(const pol_t&) const;
+		pol_t operator*(const pol_t&) const;
+		pol_t operator%(const pol_t&) const;
+		pol_t operator/(const pol_t&) const;
+		operator bool() const;
+		bool operator==(const pol_t &) const;
+		pol_t pow(u32_t) const;
+		pol_t mpow(u64_t, const pol_t &) const;
+		pol_t mpow(u64_t, u64_t, const pol_t &) const;
+		pol_t normalize() const;
+		pol_t deriv() const;
+		void read(FILE * fin, pol_format_t format = TEXTPR);
+		void write(FILE * fout, pol_format_t format = HTMLPR, bool endofline = true) const;
+		u61_t& operator[](u32_t);
+		const u61_t& operator[](u32_t) const;
+		u64_t& operator()(u32_t);
+		const u64_t& operator()(u32_t) const;
+		 u32_t get_deg() const;
+		void fact(u32_t, vector_t &) const;
+		void ddf(u32_t, vector_t &) const;
+		void split(u32_t, vector_t &) const;
+	};
+
+	union deg_t {
+		u64_t key;
+		struct {
+			u32_t x, y;
+		};
+		deg_t();
+		deg_t(u32_t, u32_t);
+		bool operator<(const deg_t &) const;
+		bool operator==(const deg_t &) const;
+		deg_t operator+(const deg_t&) const;
+	};
+
+	typedef std::pair<deg_t, pol_t> pol3v1_t;
+	typedef std::list<pol3v1_t> list_t;
+	typedef std::map<deg_t, pol_t> polmap_t;
+	typedef pol_t::vector_t vector_t;
+
+	class pol3v_t {
+	private:
+		list_t data;
+		u32_t dx;
+		u32_t dy;
+		u32_t dt;
+	public:
+		pol3v_t();
+		pol3v_t(const polmap_t &);
+		pol3v_t& operator=(const pol3v_t &);
+		pol3v_t operator+(const pol3v_t&) const;
+		pol3v_t operator-(const pol3v_t&) const;
+		pol3v_t operator*(const pol3v_t&) const;
+		pol3v_t& operator+=(const pol3v_t &);
+		pol3v_t& operator-=(const pol3v_t &);
+		pol3v_t& operator*=(const pol3v_t &);
+		pol_t subst(const pol_t &, const pol_t &) const;
+		pol3v_t get_same_rand_pol() const;
+		void read(FILE *, pol_format_t);
+		void write(FILE * fout, pol_format_t format = HTMLPR, bool endofline = 1) const;
+	};
+
+	enum file_mode_t {
+		READ, WRITE
+	};
+
+	class File {
+	private:
+		FILE *file;
+		bool opened;
+		file_mode_t mode;
+		u64_t buf;
+		size_t pos, count, read_size;
+	public:
+		File();
+		File(FILE *, file_mode_t);
+		File(const char *, file_mode_t);
+		~File();
+		bool open(const char *, file_mode_t);
+		void close();
+		void flush();
+		size_t read(u61_t &);
+		size_t write(const u61_t &, size_t = MODSIZE - 1);
+	};
+
+	class random_t {
+	private:
+		std::mt19937_64 generator;
+	public:
+		random_t();
+		u61_t operator()();
+	};
+
+	pol_t gcd(const pol_t &, const pol_t &);
+	pol_t get_x();
+	pol_t get_rand_pol(u32_t deg, bool f = true);
+	template <unsigned CLOSE_KEY_DEG = KEY_DEG, unsigned OPEN_KEY_DEG = KEY_DEG>
+	pol3v_t get_open_key(const pol_t &, const pol_t &);
+	template <unsigned Key_Deg = 2 * KEY_DEG>
+	void encrypt(File &, FILE *, const pol3v_t &);
+	template <unsigned CLOSE_KEY_DEG = KEY_DEG, unsigned OPEN_KEY_DEG = KEY_DEG>
+	void decrypt(FILE *, File &, const pol_t &, const pol_t &);
+
+	pol3v_t XXX_get_f(const u64_t max_deg, const u32_t Key_Deg);
+	pol3v_t XXX_get_mes(const u64_t max_deg, const u32_t Key_Deg, const u64_t size, const std::vector<u61_t> &);
+	void XXX_get_fact(const vector_t &fact, u64_t deg, vector_t &res);
+
+	#include "polinomial.hpp"
+};
Index: testVarieties/resource.h
===================================================================
--- testVarieties/resource.h	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
+++ testVarieties/resource.h	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
@@ -0,0 +1,96 @@
+#pragma once
+
+#include <cstdint>
+#include "types.h"
+
+const uint8_t sbox[256] = {
+	0xFC, 0xEE, 0xDD, 0x11, 0xCF, 0x6E, 0x31, 0x16, 0xFB, 0xC4, 0xFA, 0xDA, 0x23, 0xC5, 0x04, 0x4D,
+	0xE9, 0x77, 0xF0, 0xDB, 0x93, 0x2E, 0x99, 0xBA, 0x17, 0x36, 0xF1, 0xBB, 0x14, 0xCD, 0x5F, 0xC1,
+	0xF9, 0x18, 0x65, 0x5A, 0xE2, 0x5C, 0xEF, 0x21, 0x81, 0x1C, 0x3C, 0x42, 0x8B, 0x01, 0x8E, 0x4F,
+	0x05, 0x84, 0x02, 0xAE, 0xE3, 0x6A, 0x8F, 0xA0, 0x06, 0x0B, 0xED, 0x98, 0x7F, 0xD4, 0xD3, 0x1F,
+	0xEB, 0x34, 0x2C, 0x51, 0xEA, 0xC8, 0x48, 0xAB, 0xF2, 0x2A, 0x68, 0xA2, 0xFD, 0x3A, 0xCE, 0xCC,
+	0xB5, 0x70, 0x0E, 0x56, 0x08, 0x0C, 0x76, 0x12, 0xBF, 0x72, 0x13, 0x47, 0x9C, 0xB7, 0x5D, 0x87,
+	0x15, 0xA1, 0x96, 0x29, 0x10, 0x7B, 0x9A, 0xC7, 0xF3, 0x91, 0x78, 0x6F, 0x9D, 0x9E, 0xB2, 0xB1,
+	0x32, 0x75, 0x19, 0x3D, 0xFF, 0x35, 0x8A, 0x7E, 0x6D, 0x54, 0xC6, 0x80, 0xC3, 0xBD, 0x0D, 0x57,
+	0xDF, 0xF5, 0x24, 0xA9, 0x3E, 0xA8, 0x43, 0xC9, 0xD7, 0x79, 0xD6, 0xF6, 0x7C, 0x22, 0xB9, 0x03,
+	0xE0, 0x0F, 0xEC, 0xDE, 0x7A, 0x94, 0xB0, 0xBC, 0xDC, 0xE8, 0x28, 0x50, 0x4E, 0x33, 0x0A, 0x4A,
+	0xA7, 0x97, 0x60, 0x73, 0x1E, 0x00, 0x62, 0x44, 0x1A, 0xB8, 0x38, 0x82, 0x64, 0x9F, 0x26, 0x41,
+	0xAD, 0x45, 0x46, 0x92, 0x27, 0x5E, 0x55, 0x2F, 0x8C, 0xA3, 0xA5, 0x7D, 0x69, 0xD5, 0x95, 0x3B,
+	0x07, 0x58, 0xB3, 0x40, 0x86, 0xAC, 0x1D, 0xF7, 0x30, 0x37, 0x6B, 0xE4, 0x88, 0xD9, 0xE7, 0x89,
+	0xE1, 0x1B, 0x83, 0x49, 0x4C, 0x3F, 0xF8, 0xFE, 0x8D, 0x53, 0xAA, 0x90, 0xCA, 0xD8, 0x85, 0x61,
+	0x20, 0x71, 0x67, 0xA4, 0x2D, 0x2B, 0x09, 0x5B, 0xCB, 0x9B, 0x25, 0xD0, 0xBE, 0xE5, 0x6C, 0x52,
+	0x59, 0xA6, 0x74, 0xD2, 0xE6, 0xF4, 0xB4, 0xC0, 0xD1, 0x66, 0xAF, 0xC2, 0x39, 0x4B, 0x63, 0xB6
+};
+const uint64_t lbox[64] = {
+	0x8e20faa72ba0b470, 0x47107ddd9b505a38, 0xad08b0e0c3282d1c, 0xd8045870ef14980e,
+	0x6c022c38f90a4c07, 0x3601161cf205268d, 0x1b8e0b0e798c13c8, 0x83478b07b2468764,
+	0xa011d380818e8f40, 0x5086e740ce47c920, 0x2843fd2067adea10, 0x14aff010bdd87508,
+	0x0ad97808d06cb404, 0x05e23c0468365a02, 0x8c711e02341b2d01, 0x46b60f011a83988e,
+	0x90dab52a387ae76f, 0x486dd4151c3dfdb9, 0x24b86a840e90f0d2, 0x125c354207487869,
+	0x092e94218d243cba, 0x8a174a9ec8121e5d, 0x4585254f64090fa0, 0xaccc9ca9328a8950,
+	0x9d4df05d5f661451, 0xc0a878a0a1330aa6, 0x60543c50de970553, 0x302a1e286fc58ca7,
+	0x18150f14b9ec46dd, 0x0c84890ad27623e0, 0x0642ca05693b9f70, 0x0321658cba93c138,
+	0x86275df09ce8aaa8, 0x439da0784e745554, 0xafc0503c273aa42a, 0xd960281e9d1d5215,
+	0xe230140fc0802984, 0x71180a8960409a42, 0xb60c05ca30204d21, 0x5b068c651810a89e,
+	0x456c34887a3805b9, 0xac361a443d1c8cd2, 0x561b0d22900e4669, 0x2b838811480723ba,
+	0x9bcf4486248d9f5d, 0xc3e9224312c8c1a0, 0xeffa11af0964ee50, 0xf97d86d98a327728,
+	0xe4fa2054a80b329c, 0x727d102a548b194e, 0x39b008152acb8227, 0x9258048415eb419d,
+	0x492c024284fbaec0, 0xaa16012142f35760, 0x550b8e9e21f7a530, 0xa48b474f9ef5dc18,
+	0x70a6a56e2440598e, 0x3853dc371220a247, 0x1ca76e95091051ad, 0x0edd37c48a08a6d8,
+	0x07e095624504536c, 0x8d70c431ac02a736, 0xc83862965601dd1b, 0x641c314b2b8ee083
+};
+const uint8_t tau[64] = {
+	0, 8, 16, 24, 32, 40, 48, 56,
+	1, 9, 17, 25, 33, 41, 49, 57,
+	2, 10, 18, 26, 34, 42, 50, 58,
+	3, 11, 19, 27, 35, 43, 51, 59,
+	4, 12, 20, 28, 36, 44, 52, 60,
+	5, 13, 21, 29, 37, 45, 53, 61,
+	6, 14, 22, 30, 38, 46, 54, 62,
+	7, 15, 23, 31, 39, 47, 55, 63
+};
+const uint8_t pbox[28] = {
+	1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 19, 20, 21, 22, 23, 28, 29, 30, 31, 37, 38, 39, 46, 47, 55
+};
+const block512_t c[12] = {
+	{
+		0xdd806559f2a64507, 0x05767436cc744d23, 0xa2422a08a460d315, 0x4b7ce09192676901,
+		0x714eb88d7585c4fc, 0x2f6a76432e45d016, 0xebcb2f81c0657c1f, 0xb1085bda1ecadae9
+	}, {
+		0xe679047021b19bb7, 0x55dda21bd7cbcd56, 0x5cb561c2db0aa7ca, 0x9ab5176b12d69958,
+		0x61d55e0f16b50131, 0xf3feea720a232b98, 0x4fe39d460f70b5d7, 0x6fa3b58aa99d2f1a
+	}, {
+		0x991e96f50aba0ab2, 0xc2b6f443867adb31, 0xc1c93a376062db09, 0xd3e20fe490359eb1,
+		0xf2ea7514b1297b7b, 0x06f15e5f529c1f8b, 0x0a39fc286a3d8435, 0xf574dcac2bce2fc7
+	}, {
+		0x220cbebc84e3d12e, 0x3453eaa193e837f1, 0xd8b71333935203be, 0xa9d72c82ed03d675,
+		0x9d721cad685e353f, 0x488e857e335c3c7d, 0xf948e1a05d71e4dd, 0xef1fdfb3e81566d2
+	}, {
+		0x601758fd7c6cfe57, 0x7a56a27ea9ea63f5, 0xdfff00b723271a16, 0xbfcd1747253af5a3,
+		0x359e35d7800fffbd, 0x7f151c1f1686104a, 0x9a3f410c6ca92363, 0x4bea6bacad474799
+	}, {
+		0xfa68407a46647d6e, 0xbf71c57236904f35, 0x0af21f66c2bec6b6, 0xcffaa6b71c9ab7b4,
+		0x187f9ab49af08ec6, 0x2d66c4f95142a46c, 0x6fa4c33b7a3039c0, 0xae4faeae1d3ad3d9
+	}, {
+		0x8886564d3a14d493, 0x3517454ca23c4af3, 0x06476983284a0504, 0x0992abc52d822c37,
+		0xd3473e33197a93c9, 0x399ec6c7e6bf87c9, 0x51ac86febf240954, 0xf4c70e16eeaac5ec
+	}, {
+		0xa47f0dd4bf02e71e, 0x36acc2355951a8d9, 0x69d18d2bd1a5c42f, 0xf4892bcb929b0690,
+		0x89b4443b4ddbc49a, 0x4eb7f8719c36de1e, 0x03e7aa020c6e4141, 0x9b1f5b424d93c9a7
+	}, {
+		0x7261445183235adb, 0x0e38dc92cb1f2a60, 0x7b2b8a9aa6079c54, 0x800a440bdbb2ceb1,
+		0x3cd955b7e00d0984, 0x3a7d3a1b25894224, 0x944c9ad8ec165fde, 0x378f5a541631229b
+	}, {
+		0x74b4c7fb98459ced, 0x3698fad1153bb6c3, 0x7a1e6c303b7652f4, 0x9fe76702af69334b,
+		0x1fffe18a1b336103, 0x8941e71cff8a78db, 0x382ae548b2e4f3f3, 0xabbedea680056f52
+	}, {
+		0x6bcaa4cd81f32d1b, 0xdea2594ac06fd85d, 0xefbacd1d7d476e98, 0x8a1d71efea48b9ca,
+		0x2001802114846679, 0xd8fa6bbbebab0761, 0x3002c6cd635afe94, 0x7bcd9ed0efc889fb
+	}, {
+		0x48bc924af11bd720, 0xfaf417d5d9b21b99, 0xe71da4aa88e12852, 0x5d80ef9d1891cc86,
+		0xf82012d430219f9b, 0xcda43c32bcdf1d77, 0xd21380b00449b17a, 0x378ee767f11631ba
+	}
+};
+const block512_t value512 = {
+	512, 0, 0, 0, 0, 0, 0, 0
+};
Index: testVarieties/testVarieties.pro
===================================================================
--- testVarieties/testVarieties.pro	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
+++ testVarieties/testVarieties.pro	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
@@ -0,0 +1,23 @@
+QT += core
+QT -= gui
+
+CONFIG += c++11
+
+TARGET = testVarieties
+CONFIG += console
+CONFIG -= app_bundle
+
+TEMPLATE = app
+
+
+HEADERS += hash.h \
+            polynomial.h \
+            resource.h \
+            types.h
+
+SOURCES += main.cpp \
+            hash.cpp \
+            polynomial.cpp
+
+
+
Index: testVarieties/testVarieties.pro.user
===================================================================
--- testVarieties/testVarieties.pro.user	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
+++ testVarieties/testVarieties.pro.user	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
@@ -0,0 +1,334 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE QtCreatorProject>
+<!-- Written by QtCreator 3.6.0, 2016-01-04T16:08:52. -->
+<qtcreator>
+ <data>
+  <variable>EnvironmentId</variable>
+  <value type="QByteArray">{471dcdce-7a7f-45d7-b235-67cbcbce96a3}</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.ActiveTarget</variable>
+  <value type="int">0</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.EditorSettings</variable>
+  <valuemap type="QVariantMap">
+   <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
+   <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
+   <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
+    <value type="QString" key="language">Cpp</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
+    </valuemap>
+   </valuemap>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
+    <value type="QString" key="language">QmlJS</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
+    </valuemap>
+   </valuemap>
+   <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
+   <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
+   <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
+   <value type="int" key="EditorConfiguration.IndentSize">4</value>
+   <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
+   <value type="int" key="EditorConfiguration.MarginColumn">80</value>
+   <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
+   <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
+   <value type="int" key="EditorConfiguration.PaddingMode">1</value>
+   <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
+   <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
+   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
+   <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
+   <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
+   <value type="int" key="EditorConfiguration.TabSize">8</value>
+   <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
+   <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
+   <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
+   <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
+   <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
+   <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.PluginSettings</variable>
+  <valuemap type="QVariantMap"/>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Target.0</variable>
+  <valuemap type="QVariantMap">
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.5.1 GCC 64bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.5.1 GCC 64bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.55.gcc_64_kit</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/aaraujo/desarrollo/2015/criptosistemas/testVarieties</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/aaraujo/desarrollo/2015/criptosistemas/build-testVarieties-Desktop_Qt_5_5_1_GCC_64bit-Release</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/aaraujo/desarrollo/2015/criptosistemas/build-testVarieties-Desktop_Qt_5_5_1_GCC_64bit-Profile</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy locally</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
+    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
+    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
+    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
+    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
+    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
+    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
+    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
+     <value type="int">0</value>
+     <value type="int">1</value>
+     <value type="int">2</value>
+     <value type="int">3</value>
+     <value type="int">4</value>
+     <value type="int">5</value>
+     <value type="int">6</value>
+     <value type="int">7</value>
+     <value type="int">8</value>
+     <value type="int">9</value>
+     <value type="int">10</value>
+     <value type="int">11</value>
+     <value type="int">12</value>
+     <value type="int">13</value>
+     <value type="int">14</value>
+    </valuelist>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">testVarieties</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/aaraujo/desarrollo/2015/criptosistemas/testVarieties/testVarieties.pro</value>
+    <value type="bool" key="QmakeProjectManager.QmakeRunConfiguration.UseLibrarySearchPath">true</value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">testVarieties.pro</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal">true</value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
+    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
+    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.TargetCount</variable>
+  <value type="int">1</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
+  <value type="int">18</value>
+ </data>
+ <data>
+  <variable>Version</variable>
+  <value type="int">18</value>
+ </data>
+</qtcreator>
Index: testVarieties/types.h
===================================================================
--- testVarieties/types.h	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
+++ testVarieties/types.h	(revision b9397368a96a4081448c46a75231de7ed4d0d28d)
@@ -0,0 +1,39 @@
+#pragma once
+
+#include <stdint.h>
+#include <cstring>
+#include <initializer_list>
+
+
+union block512_t {
+	uint8_t x8[64];
+	uint64_t x64[8];
+	block512_t(){}
+	block512_t(const std::initializer_list<uint64_t> &x) {
+		if (x.size() < 8) {
+			memset(this, 0, sizeof(block512_t));
+		}
+		auto it = x.begin();
+		size_t i = 0, size = x.size();
+		while (i < size) {
+			x64[i] = *it;
+			++it; ++i;
+		}
+	}
+	block512_t(uint8_t x) {
+		for (int i = 0; i < 64; ++i) x8[i] = x;
+	}
+	bool operator==(const block512_t &x) const {
+		for (int i = 0; i < 8; ++i) {
+			if (x64[i] != x.x64[i]) {
+				return false;
+			}
+		}
+		return true;
+	}
+};
+
+enum hash_mode_t
+{
+	hm512, hm256
+};
