Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Новогодний мега-мозг / 25 сообщений из 48, страница 1 из 2
30.12.2013, 15:28
    #38515940
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Вот хорошо-бы Пифагоровых троек нагенерить.

Пример:
Код: powershell
1.
2.
3.
4.
5.
$ Pythagore 
(3, 4, 5), (6, 8, 10), (5, 12, 13), (9, 12, 15), (8, 15, 17), (12, 16, 20), (15, 20, 25),
 (7, 24, 25), (10, 24, 26), (20, 21, 29), (18, 24, 30), (16, 30, 34), (21, 28, 35), 
(12, 35, 37), (15, 36, 39), (24, 32, 40), (9, 40, 41), (27, 36, 45), (14, 48, 50),
(30, 40, 50)



P.S. Всех с наступающим!
...
Рейтинг: 0 / 0
30.12.2013, 18:23
    #38516129
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Вот чуть больше 850 миллионов
Код: plaintext
1.
2.
3.
unsigned int x;
for(unsigned int x=1; x<(2^32)/5; x++)
  printf("%d,%d,%d\n", 3*x, 4*x, 5*x);


Думаю надо усложнить задачу добавив условие что хоть одно из чисел простое.
...
Рейтинг: 0 / 0
30.12.2013, 18:23
    #38516130
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Гипотенуза растёт монотонно. Хм. Можно взять ее за основу. Как аргумент а катеты подбирать
целочисленно. Хочется избавится от квадратного корня. И в некотором вырожденном виде
существуют треугольники (0,5,5), (0,10,10). Можно старотвать развёртку угла с этого
чахлого треугольника и разворачивать вплоть до 45 градусов. Дальше нет смысла т.к.
будет зеркальное отражение уже найденных Пифагорских троек. А для ускорения
расчёта катетов можно попробовать алгоритм Брезенхейма для рисования дуги окружности.
...
Рейтинг: 0 / 0
30.12.2013, 18:24
    #38516132
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Dima T, да. Кст. подобные надо как-то удалять. На каждый найденный пифагорец надо
быстринько поискать в базе уже найденых (ох чую нужен Стебелёк) и дропнуть его.
...
Рейтинг: 0 / 0
30.12.2013, 19:50
    #38516200
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
как-то так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
#include <stdio.h>
#include <math.h>

#define COUNT 168
unsigned int iNumbers[COUNT] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541
,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};

int main(int argc, char* argv[])
{
	int i, x, x2, y, y2, z, z2;
	for(i=0; i<COUNT; i++)
	{
		// Гипотенуза простое число
		z = iNumbers[i];
		z2 = z*z;
		for(x = 2; x < z; x++)
		{
			x2 = x*x;
			for(y = x; y < z; y++)
			{
				y2 = y*y;
				if(x2 + y2 == z2) printf("%d,%d,%d\n", x, y, z);
				if(x2 + y2 > z2) break;
			}
		}
		// Катет простое число
		y = iNumbers[i];
		y2 = y*y;
		for(x = 2; x <= y; x++)
		{
			z = sqrt(x*x + y2); 
			z2 = z*z;
			if(x2 + y2 == z2) printf("%d,%d,%d\n", x, y, z);
		}
	}
	return 0;
}


:)

PS Пример с числами до 1`000, хотел запостить до 1`000`000 но в форум не лезет. Всем желающим продолжить майнинг: качайте таблицу простых чисел и вставляйте в пример.
...
Рейтинг: 0 / 0
30.12.2013, 23:18
    #38516283
Slip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Так известен же общий вид всех пифагоровых троек, так что просто пробежаться по двум параметрам (ну или трем, если хочется и не взаимно простые тройки)
...
Рейтинг: 0 / 0
31.12.2013, 01:27
    #38516313
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Хех... я постил где-то генерилку primes.
...
Рейтинг: 0 / 0
31.12.2013, 01:41
    #38516316
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Dima T
Код: plaintext
1.
z = sqrt(x*x + y2); 


D’oh!
...
Рейтинг: 0 / 0
31.12.2013, 02:48
    #38516330
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Primegen. По жлобски так. Сердито.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// 30.12.2013 - Mayton

// TODO: Refactor without IEEE 754
// TODO: Check for MAX_INT or MAX_DOUBLE possible limitations
// TODO: Unit testing...
inline int isqrt(int i){
	return (int)sqrt((double)i);
}


// This is a stuped brute-force prime-gen
// TODO: Improove with In-memory prime cache
int main(int argc,char **argv){
        if (argc>1){
		int maxprime = atoi(argv[1]);
		if (maxprime >= 2){
			printf("2\n");
			for(int i=3;i<=maxprime;i+=2){
				// TODO: Refactor with Bresenham's SQRT function
				int maxdiv = 1 + isqrt(i);
				int isPrime = 1;
				for(int j=3;j<maxdiv;j++){
					if (i % j == 0) {
						isPrime = 0;
						break;
					}
				}
				if (isPrime) printf("%i\n",i);
			}
		}
		return 0;
	} else {
		fprintf(stderr,"Prime Numbers Generator 1.0 of 30 dec 2013, by Mayton\n\nUsage: prime [N]\n\n");
		return 1;	
	}
	
}
...
Рейтинг: 0 / 0
31.12.2013, 13:07
    #38516490
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Если оставаться в рамках long, то "взаимно простые" это "остаток целочисленного деления не равен нулю".
В чём проблема бежать во вложенном цикле по "2*m+1", считая квадраты и прочие произведения в охранном условии?
...
Рейтинг: 0 / 0
31.12.2013, 13:21
    #38516503
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Basil A. Sidorov, ты про это?

для некоторых натуральных взаимно простых чисел m > n , разной чётности....

Наоборот, любая такая пара чисел (m,n) задаёт примитивную пифагорову тройку
...
Рейтинг: 0 / 0
31.12.2013, 13:22
    #38516504
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Да, именно про эту формулу. В целых числах всё должно быть быстренько.
...
Рейтинг: 0 / 0
31.12.2013, 13:29
    #38516512
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Не додумал - в цикле ничего "охранять" не надо.
Проверять надо взаимную простоту результатов. Что сложнее.
...
Рейтинг: 0 / 0
31.12.2013, 14:37
    #38516539
clihlt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Basil A. SidorovНе додумал - в цикле ничего "охранять" не надо.
Проверять надо взаимную простоту результатов. Что сложнее.

Так вроде же m и n должны быть взамио простые. Т.е. результат на взаимную простоту проверять не надо. А генерить взаимно простые числа с разной четностью просто: m - степень двойки, n - любое нечетное.
...
Рейтинг: 0 / 0
31.12.2013, 14:44
    #38516541
clihlt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Или просто генерить m = n + 1, а n перебирать. Тоже будут взаимно простые с разной четностью.
...
Рейтинг: 0 / 0
02.01.2014, 00:50
    #38516884
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Вот так вот пока.... Подобные треугольники еще не фильтруются.

pyfagor.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
#include <stdio.h>
#include <stdlib.h>

// Greatest Common Divisor
inline int gcd(int a,int b){
  int c;
  while ( a != 0 ) {
     c = a; a = b%a;  b = c;
  }
  return b;
}

inline int relationPrime(int m,int n){
	return gcd(m,n)==1?1:0;
}

// Stuped brute-force pyfagorean triangle generator
int main(int argc,char **argv){

	if (argc>1){
		int maxside = atoi(argv[1]);
		for(int i=1;i<maxside;i++){
		    int ii = i * i;
	            for(int j=1;j<i;j++){
			int jj = j * j;
	   		if (relationPrime(i,j)) {
				printf("(%d,%d,%d)\n",ii - jj,2 * i * j,ii + jj);
			}        
	            }
	            
	        }
		return 0;
	} else {
		fprintf(stderr,"Pyfagorean Triangle Generator 1.0 of 1 jan 2014, by Mayton\n\nUsage: pyfagor [N]\n\n");
		return 1;	
	}

	
	return 0;
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
(3,4,5)
(8,6,10)
(5,12,13)
(15,8,17)
(7,24,25)
(24,10,26)
(21,20,29)
(16,30,34)
(9,40,41)
(35,12,37)
(11,60,61)
(48,14,50)
(45,28,53)
(40,42,58)
(33,56,65)
(24,70,74)
(13,84,85)
(63,16,65)
(55,48,73)
(39,80,89)
(15,112,113)
(80,18,82)
(77,36,85)
(65,72,97)
(56,90,106)
(32,126,130)
(17,144,145)
...
Рейтинг: 0 / 0
17.01.2014, 13:03
    #38529456
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Ап. С пятницей всех. Внезапно!

Пора фильтровать плохие треугольники.
...
Рейтинг: 0 / 0
17.01.2014, 14:05
    #38529591
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Критерий подобия.

(a1,b1,c1) подобен (а2,b2,c2) тогда, когда



Или в целых числах более точная формула



При этом не забываем разворачивать оба треугольника так чтобы b был больше чем a

Пример (8,6,10) и (3,4,5) приводим к (6,8,10) и (3,4,5)
...
Рейтинг: 0 / 0
17.01.2014, 15:42
    #38529780
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Мне кажется так понятнее так написать


k - коэффициент пропорциональности

Я выше предлагал использовать простые числа
Dima TДумаю надо усложнить задачу добавив условие что хоть одно из чисел простое.
Правда не уверен что нет таких троек когда все три числа не простые и при этом нет меньшего подобного.
...
Рейтинг: 0 / 0
17.01.2014, 15:48
    #38529792
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Нам нельзя вычислять k - как вещественное. Мы рискуем потерять точность на треугольниках
большого размера. Рациональная форма вида m/n где оба числа целые позволяет решить эту
задачу точно.
...
Рейтинг: 0 / 0
17.01.2014, 15:59
    #38529813
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
По твоему алгоритму проверки все найденные надо со всеми сравнивать на подобие. Это долго.
Быстрее с помощью простых чисел меньшее подобное искать, т.е.
перебрать все простые числа (k) меньше a и убедится что все три числа не делятся на k без остатка
Код: plaintext
1.
2.
if (a % k == 0 && b % k == 0 && c % k == 0)
  printf("Меньшее подобное %d, %d, %d", a / k, b / k, c / k);
...
Рейтинг: 0 / 0
17.01.2014, 16:41
    #38529900
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
maytonНам нельзя вычислять k - как вещественное.
При наличии полного набора троек всегда будет наименьшая подобная для которой k будет целое
т.е. бОльшая подобная выражается как
Код: plaintext
1.
(a*k)^2 + (b*k)^2 = (c*k)^2 


тут k любое число, (a,b,c) - минимальное подобное
т.е. a1 = a * k
т.к. a1 и a целые то k тоже должно быть целое

Если подходит нецелое k то (a,b,c) - не минимальное подобное

Подзабыл как это доказать математически, примерно так:
раскладываем a на простые множители m1*m2*m3 находим те которые дают с умножением на k минимальное целое, например m1*m2*k, следовательно m1*m2 это то целое на которое можно разделить исходное (a,b,c)
...
Рейтинг: 0 / 0
17.01.2014, 16:50
    #38529913
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Тут по сути вопрос идёт о сравннении стоимостей поиска в бинарных деревьях
и стоимостей генерации простых неподобных треугольников.
...
Рейтинг: 0 / 0
17.01.2014, 17:56
    #38529986
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
Мне просто кажется что факторизация всех трёх (или двух?) сторон
будет более затратной чем просто binary search.
...
Рейтинг: 0 / 0
17.01.2014, 19:55
    #38530124
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Новогодний мега-мозг
maytonТут по сути вопрос идёт о сравннении стоимостей поиска в бинарных деревьях
и стоимостей генерации простых неподобных треугольников.
Я о принципиально другом подходе к проверке подобных. По твоей формуле надо сравнивать все результаты со всеми, по моей просто узнать есть ли пропорционально меньше, и наименьший считать первым.
Проверять на наличие меньшего так:
Код: plaintext
1.
if(GetDivider(a, b, c) == 1) ... меньше нет


GetDivider(a, b, c)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
#define COUNT 168
unsigned int iPrime[COUNT] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541
,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};

// Возвращает общий делитель тройки
inline int GetDivider(int a, int b, int c)
{
	int iRet = 1;
	unsigned int iMin = (a < b ? a : b) >> 1;
	unsigned int* ptrRow = &iPrime[0];
	unsigned int* ptrLast = &iPrime[COUNT - 1];
	if(*ptrLast < iMin) MessageBox(NULL, "Таблицу простых чисел надо побольше", "УПС :(", 0);
	while(ptrRow <= ptrLast)
	{
		ptrRow = &iPrime[0];
		while(ptrRow <= ptrLast)
		{
			if (a % *ptrRow == 0 && b % *ptrRow == 0 && c % *ptrRow == 0) 
			{
				iRet = iRet * *ptrRow;
				a = a / *ptrRow;
				b = b / *ptrRow;
				c = c / *ptrRow;
				break;
			}
			ptrRow++;
			if(*ptrRow > iMin) ptrRow = ptrLast + 1;
		}
	}
	//printf("Divider %d Minimum (%d, %d, %d)\n", iRet, a, b, c);
	return iRet;
}


т.е. GetDivider() возвращает наибольший общий делитель для тройки, поделив на который получаем минимально возможную подобную тройку.
Если допилить твой код добавив игнор не минимальных, то будет так
Генератор Майтона поправленный
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
#include <stdio.h>
#include <stdlib.h>

// Greatest Common Divisor
inline int gcd(int a,int b){
  int c;
  while ( a != 0 ) {
     c = a; a = b%a;  b = c;
  }
  return b;
}

inline int relationPrime(int m,int n){
	return gcd(m,n)==1?1:0;
}

// Stuped brute-force pyfagorean triangle generator
int main(int argc,char **argv){

	if (argc>1){
		int maxside = atoi(argv[1]);
		for(int i=1;i<maxside;i++){
		    int ii = i * i;
	            for(int j=1;j<i;j++){
			int jj = j * j;
	   		if (relationPrime(i,j)) {
				if(GetDivider(ii - jj, 2 * i * j, ii + jj) == 1) printf("(%d,%d,%d)\n",ii - jj,2 * i * j,ii + jj);
			}        
	            }
	            
	        }
		return 0;
	} else {
		fprintf(stderr,"Pyfagorean Triangle Generator 1.0 of 1 jan 2014, by Mayton\n\nUsage: pyfagor [N]\n\n");
		return 1;	
	}

	
	return 0;
}


Твой алгоритм я не понял (если честно) но если он генерит все последовательно то дубли отфильтруются.

PS В моем примере простые числа до 1000, можно их вычислять, но проще скачать с инета, у меня массив 78498 чисел до миллиона, но исходник в форум не лезет даже в архиве.

PPS Ты цель обозначь. Чего ищем? Максимально большое и непрерывную последовательность?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Новогодний мега-мозг / 25 сообщений из 48, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]