@@ -4,7 +4,7 @@
Loading
4 4
\brief Ideals in GF(2)[x0,x1,...]
5 5
\project GF2 [algebra over GF(2)]
6 6
\created 2004.01.01
7 -
\version 2020.07.14
7 +
\version 2020.07.15
8 8
\license This program is released under the MIT License. See Copyright Notices 
9 9
in GF2/info.h.
10 10
*******************************************************************************
@@ -264,8 +264,7 @@
Loading
264 264
	{	
265 265
		// другая система?
266 266
		assert(static_cast<void*>(this) != static_cast<void*>(&iRight));
267 -
		typename MI<_m, _O1>::const_iterator iter;
268 -
		for (iter = iRight.begin(); iter != iRight.end(); ++iter)
267 +
		for (auto iter = iRight.begin(); iter != iRight.end(); ++iter)
269 268
			Remove(*iter);
270 269
	}
271 270
@@ -471,7 +470,7 @@
Loading
471 470
		for (auto iter = polyMons.begin(); iter != polyMons.end();)
472 471
		{
473 472
			// от младших мономов к старшим
474 -
			typename MP<_n, _O>::iterator iter1 = --polyMons.end();
473 +
			auto iter1 = --polyMons.end();
475 474
			for (; iter1 != iter; --iter1)
476 475
				if (*iter1 | *iter)
477 476
					break;
@@ -1116,16 +1115,17 @@
Loading
1116 1115
			MM<_n> mon = *(--tosee.end());
1117 1116
			tosee.pop_back();
1118 1117
			// один из старших мономов делит mon?
1119 -
			typename MP<_n, _O1>::reverse_iterator iter;
1120 -
			for (iter = mons.rbegin(); iter != mons.rend(); iter++)
1121 -
				if (*iter | mon) break;
1118 +
			auto iter = mons.rbegin();
1119 +
			for (; iter != mons.rend(); ++iter)
1120 +
				if (*iter | mon)
1121 +
					break;
1122 1122
			// элемент базиса и еще не добавлен в базис?
1123 1123
			if (iter == mons.rend() && !polyQB.IsContain(mon))
1124 1124
			{
1125 1125
				// добавить в базис
1126 1126
				polyQB.Union(mon);
1127 1127
				// умножаем его на всевозможные существенные переменные
1128 -
				for (size_t prev = SIZE_MAX, cur = 0; cur < _n; cur++)
1128 +
				for (size_t prev = SIZE_MAX, cur = 0; cur < _n; ++cur)
1129 1129
					if (vars.Test(cur) && !mon.Test(cur))
1130 1130
					{
1131 1131
						mon.Set(cur, 1);
@@ -1186,8 +1186,8 @@
Loading
1186 1186
			{
1187 1187
				// ищем тривиальное уравнение x_i = 0
1188 1188
				// если тривиальных нет, то выбираем первое уравнение 
1189 -
				typename MP<_n, _O>::iterator iter;
1190 -
				for (iter = pair.second.end(); iter != pair.second.begin();)
1189 +
				auto iter = pair.second.end();
1190 +
				while (iter != pair.second.begin())
1191 1191
					if ((--iter)->Weight() == 1) 
1192 1192
						break;
1193 1193
				// ищем переменную, которая будет исключаться

@@ -4,7 +4,7 @@
Loading
4 4
\brief Multivariate polynomials in GF(2)[x0,x1,...]
5 5
\project GF2 [algebra over GF(2)]
6 6
\created 2004.01.01
7 -
\version 2020.05.07
7 +
\version 2020.07.15
8 8
\license This program is released under the MIT License. See Copyright Notices 
9 9
in GF2/info.h.
10 10
*******************************************************************************
@@ -325,7 +325,7 @@
Loading
325 325
	void UnionNC(const MP<_n, _O1>& polyRight)
326 326
	{
327 327
		iterator iter = begin();
328 -
		typename MP<_n, _O1>::const_iterator iterRight = polyRight.begin();
328 +
		auto iterRight = polyRight.begin();
329 329
		while (iterRight != polyRight.end())
330 330
		{
331 331
			// сравнить текущие элементы списков
@@ -403,7 +403,7 @@
Loading
403 403
	void DiffNC(const MP<_n, _O1>& polyRight)
404 404
	{
405 405
		iterator iter = begin();
406 -
		typename MP<_n, _O1>::const_iterator iterRight = polyRight.begin();
406 +
		auto iterRight = polyRight.begin();
407 407
		while (iterRight != polyRight.end())
408 408
		{
409 409
			// сравнить текущие элементы списков
@@ -522,7 +522,7 @@
Loading
522 522
	void SymDiffNC(const MP<_n, _O1>& polyRight)
523 523
	{
524 524
		iterator iter = begin();
525 -
		typename MP<_n, _O1>::const_iterator iterRight = polyRight.begin();
525 +
		auto iterRight = polyRight.begin();
526 526
		while (iterRight != polyRight.end())
527 527
		{
528 528
			// сравнить текущие элементы списков
@@ -775,8 +775,7 @@
Loading
775 775
	template<size_t _m, class _O1>
776 776
	MP& operator=(const MP<_m, _O1>& polyRight)
777 777
	{	
778 -
		typename MP<_m, _O1>::const_iterator iter;
779 -
		for (iter = polyRight.begin(); iter != polyRight.end(); ++iter)
778 +
		for (auto iter = polyRight.begin(); iter != polyRight.end(); ++iter)
780 779
			SymDiff(MM<_n>(*iter));
781 780
		return *this;
782 781
	}
@@ -847,14 +846,14 @@
Loading
847 846
848 847
	-#	Класс Geobucket<_d> поддерживает специальную структуру данных:
849 848
		"последовательность корзин с геометрически растущими размерами" 
850 -
		(\b geobucket) [Yan T. The Geobucket Data Structure for Polynomials, 
849 +
		(geobucket) [Yan T. The Geobucket Data Structure for Polynomials, 
851 850
		J. of Symb. Comp., v.25 (1998)]. Корзинами являются многочлены как 
852 851
		упорядоченные списки мономов.
853 852
	-#	Использование geobucket позволяет повысить скорость следующего 
854 853
		алгоритмического примитива:
855 854
		\code
856 855
		for(...) 
857 -
			выделить старший моном многочлена p,
856 +
			выделить старший моном многочлена p;
858 857
			p += некоторый многочлен;
859 858
		\endcode
860 859
	-#	Скорость роста размеров корзин определяет параметр шаблона _d.
@@ -866,7 +865,7 @@
Loading
866 865
		выбор d = 4.31. В реализации поддержаны только целые _d.
867 866
	-#	Мономиальный порядок передается в конструкторе через ссылку на объект
868 867
		поддержки порядка либо через ссылку на многочлен с определенным 
869 -
		порядком. Все добавляемые в \b geobucket многочлены должны быть 
868 +
		порядком. Все добавляемые в geobucket многочлены должны быть 
870 869
		согласованы с первоначальным порядком конструктора.
871 870
	-#	Для повышения эффективности мономы добавляемого многочлена poly
872 871
		не копируются, а перемещаются в корзины. Многочлен poly "отдает"
@@ -937,7 +936,7 @@
Loading
937 936
938 937
		//! Исключающее добавление многочлена
939 938
		/*! Добавляются мономы согласованного многочлена polyRight, 
940 -
			которые отсутствуют в \b geobucket, и исключаются присутствующие 
939 +
			которые отсутствуют в geobucket, и исключаются присутствующие 
941 940
			мономы. */
942 941
		void SymDiffSplice(MP& polyRight)
943 942
		{
@@ -963,8 +962,8 @@
Loading
963 962
		//! Старший моном
964 963
		/*! Определяется и удаляется старший моном многочлена, 
965 964
			размещенного в корзинах.
966 -
			\return \b false, если многочлен нулевой, и \b true, 
967 -
			если многочлен ненулевой и старший моном занесен в lm. */
965 +
			\return false, если многочлен нулевой, и true, если многочлен
966 +
			ненулевой и старший моном занесен в lm. */
968 967
		bool PopLM(MM<_n>& lm)
969 968
		{
970 969
			int cmp;
@@ -973,7 +972,8 @@
Loading
973 972
			do
974 973
			{
975 974
				// пропускаем пустые корзины
976 -
				if (_buckets[--j].IsEmpty()) continue;
975 +
				if (_buckets[--j].IsEmpty())
976 +
					continue;
977 977
				// новый старший моном?
978 978
				if (i == SIZE_MAX || (cmp = o.Compare(_buckets[j].LM(), lm)) > 0)
979 979
					lm = _buckets[i = j].LM();
@@ -1006,37 +1006,40 @@
Loading
1006 1006
// мультипликативные примитивы
1007 1007
public:
1008 1008
	//! Умножение на многочлен
1009 -
	/*! Выполняется стандартное умножение на многочлен polyRight. */
1009 +
	/*! Выполняется умножение на многочлен polyRight. */
1010 1010
	template<class _O1>
1011 1011
	void MultClassic(const MP<_n, _O1>& polyRight)
1012 1012
	{
1013 1013
		MP polySave(*this), poly(_order);
1014 -
		typename MP<_n, _O1>::const_iterator iter;
1015 -
		for (clear(), iter = polyRight.end(); iter != polyRight.begin();)
1016 -
			SymDiffSplice((poly = polySave) *= *--iter);
1014 +
		clear();
1015 +
		for (auto iter = polyRight.rbegin(); iter != polyRight.rend(); ++iter)
1016 +
			SymDiffSplice((poly = polySave) *= *iter);
1017 1017
	}
1018 1018
1019 -
	//! Умножение на многочлен
1020 -
	/*! Выполняется умножение на многочлен polyRight с использованием
1021 -
		\b geobucket. */
1022 1019
	template<class _O1>
1023 -
	void Mult(const MP<_n, _O1>& polyRight)
1020 +
	void MultGB(const MP<_n, _O1>& polyRight)
1024 1021
	{
1025 1022
		// поскольку операция выбора старшего монома не задействована,
1026 1023
		// коэффициент роста geobucket выберем равным 3
1027 1024
		Geobucket<3> gb(_order);
1028 1025
		MP poly;
1029 1026
		// цикл по мономам polyRight
1030 -
		typename MP<_n, _O1>::const_iterator iterRight;
1031 -
		for (iterRight = polyRight.end(); iterRight != polyRight.begin();)
1032 -
			gb.SymDiffSplice((poly = *this) *= *--iterRight);
1027 +
		typename MP<_n, _O1>::const_iterator iter;
1028 +
		for (auto iter = polyRight.rbegin(); iter != polyRight.rend(); ++iter)
1029 +
			gb.SymDiffSplice((poly = *this) *= *iter);
1033 1030
		// сборка
1034 1031
		gb.Mount(*this);
1035 1032
	}
1036 1033
1034 +
	template<class _O1>
1035 +
	inline void Mult(const MP<_n, _O1>& polyRight)
1036 +
	{
1037 +
		MultClassic(polyRight);
1038 +
	}
1039 +
1037 1040
	//! Остаток от деления на многочлен
1038 1041
	/*! Определяется остаток от деления на ненулевой многочлен polyRight.
1039 -
		\return \b true, если остаток отличается от делимого. */
1042 +
		\return Признак того, что остаток отличается от делимого. */
1040 1043
	template<class _O1>
1041 1044
	bool ModClassic(const MP<_n, _O1>& polyRight)
1042 1045
	{	
@@ -1055,12 +1058,8 @@
Loading
1055 1058
		return changed;
1056 1059
	}
1057 1060
1058 -
	//! Остаток от деления на многочлен
1059 -
	/*! Определяется остаток от деления на ненулевой многочлен polyRight. 
1060 -
		Используется структура geobucket. 
1061 -
		\return \b true, если остаток отличается от делимого. */
1062 1061
	template<class _O1>
1063 -
	bool Mod(const MP<_n, _O1>& polyRight)
1062 +
	bool ModGB(const MP<_n, _O1>& polyRight)
1064 1063
	{	
1065 1064
		// поскольку операция выбора старшего монома задействована,
1066 1065
		// коэффициент роста geobucket выберем равным 4
@@ -1087,11 +1086,18 @@
Loading
1087 1086
		return changed;
1088 1087
	}
1089 1088
1089 +
	template<class _O1>
1090 +
	inline bool Mod(const MP<_n, _O1>& polyRight)
1091 +
	{
1092 +
		return ModGB(polyRight);
1093 +
	}
1094 +
1090 1095
	//! Частное от деления на многочлен
1091 1096
	/*! Определяются частное от деления на ненулевой многочлен polyRight.*/
1092 1097
	template<class _O1>
1093 1098
	void DivClassic(const MP<_n, _O1>& polyRight)
1094 1099
	{	
1100 +
		assert(polyRight != 0);
1095 1101
		// готовим временный многочлен и многочлен для остатка
1096 1102
		MP poly(_order), polyMod(_order);
1097 1103
		polyMod.Swap(*this);
@@ -1113,12 +1119,10 @@
Loading
1113 1119
		while (iter != polyMod.end());
1114 1120
	}
1115 1121
1116 -
	//! Частное от деления на многочлен
1117 -
	/*! Находится частное от деления на ненулевой многочлен polyRight.
1118 -
		Используется структура \b geobucket */
1119 1122
	template<class _O1>
1120 -
	void Div(const MP<_n, _O1>& polyRight)
1121 -
	{	
1123 +
	void DivGB(const MP<_n, _O1>& polyRight)
1124 +
	{
1125 +
		assert(polyRight != 0);
1122 1126
		// поскольку операция выбора старшего монома задействована,
1123 1127
		// коэффициент роста geobucket выберем равным 4
1124 1128
		Geobucket<4> gb(*this);
@@ -1140,6 +1144,12 @@
Loading
1140 1144
			}
1141 1145
	}
1142 1146
1147 +
	template<class _O1>
1148 +
	inline void Div(const MP<_n, _O1>& polyRight)
1149 +
	{
1150 +
		DivGB(polyRight);
1151 +
	}
1152 +
1143 1153
	//! Признак делимости
1144 1154
	/*! Проверяется, что все мономы многочлена делятся на mRight. */
1145 1155
	bool IsDivisibleBy(const MM<_n>& mRight) const
@@ -1169,11 +1179,8 @@
Loading
1169 1179
		Swap(polyResult);
1170 1180
	}
1171 1181
1172 -
	//! Замена переменной
1173 -
	/*! Выполняется замена вхождений переменной с номером pos 
1174 -
		на многочлен polyReplace. Используется структура \b geobucket. */
1175 1182
	template<class _O1>
1176 -
	void Replace(size_t pos, const MP<_n, _O1>& polyReplace)
1183 +
	void ReplaceGB(size_t pos, const MP<_n, _O1>& polyReplace)
1177 1184
	{	
1178 1185
		MM<_n> m;
1179 1186
		MP poly(_order);
@@ -1189,12 +1196,19 @@
Loading
1189 1196
		gb.Mount(*this);
1190 1197
	}
1191 1198
1199 +
	template<class _O1>
1200 +
	inline void Replace(size_t pos, const MP<_n, _O1>& polyReplace)
1201 +
	{
1202 +
		ReplaceGB(pos, polyReplace);
1203 +
	}
1204 +
1192 1205
	//! Замена переменной
1193 1206
	/*! Выполняется замена вхождений переменной с номером pos 
1194 1207
		на переменную с номером posNew. */
1195 1208
	void Replace(size_t pos, size_t posNew)
1196 1209
	{	
1197 -
		if (pos == posNew) return;
1210 +
		if (pos == posNew)
1211 +
			return;
1198 1212
		for (iterator iter = begin(); iter != end(); ++iter)
1199 1213
			// переменная pos входит в моном *iter?
1200 1214
			if (iter->Test(pos))
@@ -1219,8 +1233,10 @@
Loading
1219 1233
		if (val == 0)
1220 1234
		{
1221 1235
			for (iterator iter = begin(); iter != end();)
1222 -
				if (iter->Test(pos)) iter = erase(iter);
1223 -
				else ++iter;
1236 +
				if (iter->Test(pos))
1237 +
					iter = erase(iter);
1238 +
				else
1239 +
					++iter;
1224 1240
		}
1225 1241
		else
1226 1242
		{
@@ -2111,8 +2127,7 @@
Loading
2111 2127
operator<<(std::basic_ostream<_Char, _Traits>& os, const MP<_n, _O>& polyRight)
2112 2128
{
2113 2129
	bool waitfirst = true;
2114 -
	typename MP<_n, _O>::const_iterator iter = polyRight.begin();
2115 -
	for (; iter != polyRight.end(); ++iter)
2130 +
	for (auto iter = polyRight.begin(); iter != polyRight.end(); ++iter)
2116 2131
	{
2117 2132
		if (!waitfirst) os << " + ";
2118 2133
		os << *iter;

@@ -4,7 +4,7 @@
Loading
4 4
\brief Buchberger's algorithm
5 5
\project GF2 [algebra over GF(2)]
6 6
\created 2006.01.01
7 -
\version 2020.05.07
7 +
\version 2020.07.15
8 8
\license This program is released under the MIT License. See Copyright Notices 
9 9
in GF2/info.h.
10 10
*******************************************************************************
@@ -313,7 +313,7 @@
Loading
313 313
		// критерий A:
314 314
		// если LM(poly) | [LM(f_i), LM(f_j)] и (f_i, f_j) не является r-парой,
315 315
		// то (f_i, f_j) можно исключить
316 -
		typename _CPs::iterator posPair = _pairs.begin();
316 +
		auto posPair = _pairs.begin();
317 317
		for (; posPair != _pairs.end();)
318 318
			if ((posPoly->LM() | posPair->lcm) && !posPair->IsRPair())
319 319
				posPair = _pairs.erase(posPair), _stat.a_criterion++;
@@ -631,4 +631,4 @@
Loading
631 631
632 632
} // namespace GF2
633 633
634 -
#endif // __GF2_BUCHB

@@ -125,7 +125,7 @@
Loading
125 125
	typedef MOGrevlex<6> O2;
126 126
	// 1
127 127
	MP<6> p1 = (X(0) + X(1)) * (X{ 1, 2 } + X{ 2, 3, 4 });
128 -
	MP<6> p2 = (X(0) + X(1)) + (X{ 1, 2 } + X{ 2, 3, 4 });
128 +
	MP<6> p2 = (X(0) + X(1)) + (X{ 1, 2 } + X{ 2, 4 });
129 129
	// 2
130 130
	MP<6, O1> p3(p1);
131 131
	p3 /= X(0) + X(1);
Files Coverage
include/gf2 59.37%
src/env.cpp 78.21%
test/test.cpp 89.61%
Project Totals (10 files) 62.57%
33.4
TRAVIS_OS_NAME=linux

No yaml found.

Create your codecov.yml to customize your Codecov experience

Sunburst
The inner-most circle is the entire project, moving away from the center are folders then, finally, a single file. The size and color of each slice is representing the number of statements and the coverage, respectively.
Icicle
The top section represents the entire project. Proceeding with folders and finally individual files. The size and color of each slice is representing the number of statements and the coverage, respectively.
Grid
Each block represents a single file in the project. The size and color of each block is represented by the number of statements and the coverage, respectively.
Loading