- Файл
- История файлов
- Использование файла
- Глобальное использование файлов
Исходный файл (1920 × 1080 пикселей, размер файла: 2,01 МБ, MIME - тип: изображение / PNG )
Резюме
ОписаниеAlgebraicszoom.png | Английский: Визуализация (счетного) поля алгебраических чисел на комплексной плоскости. Цвета указывают степень многочлена, корнем которого является число (красный = линейный, то есть рациональный, зеленый = квадратичный, синий = кубический, желтый = четвертый ...). Точки становятся меньше по мере увеличения коэффициентов целочисленного полинома. В представлении справа внизу показаны целые числа 0,1 и 2, а вверху - + i . |
Дата | |
Источник | Я ( Стивен Дж. Брукс ( выступление )) создал эту работу полностью сам. |
Автор | Стивен Дж. Брукс ( выступление ) Исходный код на языке C с OpenGL. |
Другие версии | leadcoeff.png |
Исходный код на C
Вот исходный код. Графика OpenGL смешана с математикой. Математические процедуры - это findroots_inner (аргументы, заданные в findroots ) и precalc (возвращает набор алгебраических чисел в структуре Point, x + i y - значение, o - порядок полинома, который их произвел, а h - мера сложности полином). LSet - это просто объект-контейнер (например, Vector FILE *out=fopen(...)
лог-файлами, при необходимости могут быть удалены.
#include #include char nonconv ; int fq [ 5001 ];void findroots_inner ( Комплекс * c , const unsigned o , LSet * pr ) { Комплекс r ; если ( o == 1 ) { r = - c [ 0 ] / c [ 1 ]; LSet_add ( пр , & r ); возврат ; } int n ; Комплекс е , д , р , или ; r = frnd ( 2 ) -1 + I * ( frnd ( 2 ) -1 ); int i = 0 , j = 0 ; // Комплекс h [1000]; do { if ( j == 500 ) { r = frnd ( 2 ) -1 + I * ( frnd ( 2 ) -1 ); j = 0 ;} иначе j ++ ; если ( я > = 5000 ) { nonconv = 1 ; break ;} / * { ФАЙЛ * out = fopen ("5000iters.log", "at"); fprintf (выход, "----- \ п"); // for (i = 0; i <1000; i ++) fprintf (out, "h [% d] =% lg +% lgi \ n", i, h [i] .re, h [i] .im); fclose (выход); перерыв; } * / // иначе h [i] = r; i ++ ; или = r ; f = 0 ; d = 0 ; р = 1 ; для ( n = 0 ; n < o ; n ++ , p * = r ) { f + = p * c [ n ]; d + = p * c [ n + 1 ] * ( n + 1 ); } f + = p * c [ o ]; г - = ж / д ; } while ( modsquared ( r - или ) > 1e-20 ); fq [ i ] ++ ; LSet_add ( пр , & r ); для ( n = o ; n > 0 ; n - ) c [ n -1 ] + = r * c [ n ]; для ( n = 0 ; n < o ; n ++ ) c [ n ] = c [ n + 1 ]; findroots_inner ( c , o -1 , пр ); }Complex * findroots ( Complex * c , const unsigned o ) { // c [0] до c [o] являются коэффициентами от 1 до x ^ o; c уничтожается, создается возвращаемое значение LSet r = LSet ( Complex ); findroots_inner ( c , o , & r ); бесплатно ( c ); вернуть р . а ; }#include #include #include #include GLuint othertex ( const unsigned sz ) { GLuint ret ; glGenTextures ( 1 , & ret ); glBindTexture ( GL_TEXTURE_2D , ret ); glTexParameterf ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR_MIPMAP_LINEAR ); glTexParameterf ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR ); // анисо (); int n , x , y , xs = sz , ys = sz ; беззнаковый char * td = malloc ( xs * ys * 3 ); float f ; for ( y = ys -1 ; y > = 0 ; y - ) for ( x = xs -1 ; x > = 0 ; x - ) { n = ( y * xs + x ) * 3 ; f = sq (( float ) sz / 2 ) / ( 1 + sq (( float ) x - xs / 2 ) + sq (( float ) y - ys / 2 )); td [ n ] = td [ n + 1 ] = td [ n + 2 ] = Mini ( 0xFF , f ); } gluBuild2DMipmaps ( GL_TEXTURE_2D , 3 , xs , ys , GL_RGB , GL_UNSIGNED_BYTE , td ); бесплатно ( тд ); return ret ; }void putblob ( const float x , const float y , const float r ) { glTexCoord2f ( 1 , 1 ); glVertex2f ( x + r * 16 , y + r * 16 ); glTexCoord2f ( 1 , 0 ); glVertex2f ( x + r * 16 , y - r * 16 ); glTexCoord2f ( 0 , 0 ); glVertex2f ( x - r * 16 , y - r * 16 ); glTexCoord2f ( 0 , 1 ); glVertex2f ( х - г * 16 , у + г * 16 ); }typedef struct { двойной x , y ; int h , o ;} Точка ;Предварительное вычисление LSet ( const int maxh ) { LSet ret = LSet ( Point ); Пункт p ; int h , i , j , k , nz , l , sp ; для ( я = 0 ; я <= 5000 ; я ++ ) fq [ я ] = 0 ; int temps = 0 , eqns = 0 , корни = 0 ; for ( h = 2 ; h <= maxh ; h ++ ) // Сумма меры сложности (| c_n | +1) { p . h = h ; int * t = malloc ( h * sizeof ( int )); for ( i = ( 1 << ( h -1 )) -1 ; i > = 0 ; i - = 2 ) // 2 шаг останавливает t [k-1] равным нулю { t [ 0 ] = 0 ; for ( j = h -2 , k = 0 ; j > = 0 ; j - ) if (( i >> j ) & 1 ) t [ k ] ++ ; иначе { k ++ ; t [ k ] = 0 ;} temps ++ ; если ( k == 0 ) продолжить ; // k - порядок p . о = к ; // po = t [k]; nz = 0 ; for ( j = k ; j > = 0 ; j - ) if ( t [ j ] ! = 0 ) nz ++ ; for ( j = ( 1 << ( nz -1 )) -1 ; j > = 0 ; j - ) // Цикл подписи { Complex * c = malloc (( k + 1 ) * sizeof ( Complex )); for ( l = k , sp = 1 ; l > = 0 ; l - ) if ( t [ l ] == 0 || l == k ) c [ l ] = t [ l ]; иначе { c [ l ] = ( j & sp ? t [ l ] : - t [ l ]); sp << = 1 ;} eqns ++ ; nonconv = 0 ; Комплекс * cc = malloc (( k + 1 ) * sizeof ( Комплекс )); memcpy ( cc , c , ( k + 1 ) * sizeof ( Комплекс )); c = findroots ( c , k ); if ( ! nonconv ) для ( l = k -1 ; l > = 0 ; l - ) { корни ++ ; стр . х = с [ 1 ]. ре ; стр . y = c [ l ]. им ; LSet_add ( & ret , & p ); } else { FILE * out = fopen ( "nonconv.log" , "at" ); for ( l = k ; l > = 0 ; l - ) fprintf ( out , "% + lg * z ^% d% s" , cc [ l ]. re , l , ( l ? "" : " \ n " )); fclose ( выход ); } бесплатно ( c ); бесплатно ( cc ); } } бесплатно ( t ); } ФАЙЛ * out = fopen ( "stats.txt" , "at" ); fprintf ( из , "временные секретари =% d =% уравнения г корней =% d \ п " , временные секретари , уравнения , корни ); fclose ( выход ); out = fopen ( "histoiters.csv" , "вес" ); for ( i = 0 ; i <= 5000 ; i ++ ) fprintf ( out , "% d,% d \ n " , i , fq [ i ]); fclose ( выход ); return ret ; }WINMAIN { int n ; gl_ortho = 1 ; ГРАФИКА ( 0 , 0 , «Алгебраические числа [Стивен Брукс 2010]» ); GLuint tex = othertex ( 256 ), список = 0 ; двойной ox = 0 , oy = 0 , zoom = yres / 5 , k1 = 0,125 , k2 = 0,5 ; SetCursorPos ( xres / 2 , yres / 2 ); двойной от = либо время (); LSet ps = Prealc ( 15 ); ПЕТЛЯ { двойной dt = либо время () - от ; от = либо время (); ox + = ( mx - xres / 2 ) / масштабирование ; oy + = ( my - yres / 2 ) / zoom ; если ( КЛЮЧ ( VK_O )) ox = oy = 0 ; SetCursorPos ( xres / 2 , yres / 2 ); если ( mb & 1 ) zoom * = exp ( dt * 3 ); если ( mb & 2 ) zoom * = exp ( - dt * 3 ); если ( KHIT ( VK_Z )) { k1 * = 1.3 ; glDeleteLists ( список , 1 ); list = 0 ;} если ( KHIT ( VK_X )) { k1 / = 1.3 ; glDeleteLists ( список , 1 ); list = 0 ;} если ( KHIT ( VK_C )) { k2 + = 0,05 ; glDeleteLists ( список , 1 ); список = 0 ;} если ( ХИТ ( ВК_В )) { k2 - = 0,05 ; glDeleteLists ( список , 1 ); список = 0 ;} glMatrixMode ( GL_MODELVIEW ); glPushMatrix (); glScaled ( масштабирование , масштабирование , масштабирование ); glTranslated (( xres / 2 / zoom ) - ox , ( yres / 2 / zoom ) - oy , 0 ); если ( ! список ) { список = glGenLists ( 1 ); glNewList ( список , GL_COMPILE_AND_EXECUTE ); glEnable ( GL_BLEND ); glBlendFunc ( GL_ONE , GL_ONE ); glDisable ( GL_DEPTH_TEST ); glEnable ( GL_TEXTURE_2D ); glBindTexture ( GL_TEXTURE_2D , текс ); glBegin ( GL_QUADS ); Точка * p = ps . а ; for ( n = ps . m -1 ; n > = 0 ; n - ) { switch ( p [ n ]. o ) { case 1 : glColor3f ( 1 , 0 , 0 ); перерыв ; случай 2 : glColor3f ( 0 , 1 , 0 ); перерыв ; случай 3 : glColor3f ( 0 , 0 , 1 ); перерыв ; случай 4 : glColor3f ( 0,7 , 0,7 , 0 ); перерыв ; случай 5 : glColor3f ( 1 , 0,6 , 0 ); перерыв ; случай 6 : glColor3f ( 0 , 1 , 1 ); перерыв ; случай 7 : glColor3f ( 1 , 0 , 1 ); перерыв ; случай 8 : glColor3f ( 0,6 , 0,6 , 0,6 ); перерыв ; по умолчанию : glColor3f ( 1 , 1 , 1 ); перерыв ; } putblob ( p [ n ]. x , p [ n ]. y , k1 * pow ( k2 , p [ n ]. h -3 )); } glEnd (); от = либо время (); glEndList (); } else if ( список ) glCallList ( список ); если ( КЛЮЧ ( VK_L )) { glDeleteLists ( список , 1 ); list = 0 ;} if ( KEY ( VK_CONTROL ) && KHIT ( VK_S )) screenshotauto (); glMatrixMode ( GL_MODELVIEW ); glPopMatrix (); ccl (); } }
Лицензирование
Этот файл находится под лицензией Creative Commons Attribution 3.0 Unported . | ||
https://creativecommons.org/licenses/by/3.0 CC BY 3.0 Лицензия Creative Commons Attribution 3.0 правдаправда |
Элементы, изображенные в этом файле
изображает
статус авторского права
защищенный авторским правом
лицензия на авторское право
Creative Commons Attribution 3.0 без переноса
История файлов
Щелкните дату / время, чтобы просмотреть файл в том виде, в котором он был в то время.
Дата / время | Эскиз | Габаритные размеры | Пользователь | Комментарий | |
---|---|---|---|---|---|
Текущий | 21:48, 27 марта 2010 г. | 1920 × 1080 (2,01 МБ) | Стивен Дж. Брукс | {{Информация | Описание = Визуализация (счетного) поля алгебраических чисел на комплексной плоскости. Цвета указывают степень многочлена, корнем которого является число (красный = линейный, т.е. рациональные, зеленый = квадратичный, синий = кубический, желтый |
Использование файла
- Алгебраическое число
- Первая статья Кантора по теории множеств
- Определимое действительное число
- Пользователь: RJGray / Cantor draft1
- Пользователь: RJGray / Cantor draft2
- Пользователь: RJGray / Sandbox5
- Пользователь: Стивен Дж. Брукс / алгебраика
Глобальное использование файлов
Следующие другие вики используют этот файл:
- Использование на pt.wikibooks.org
- Usuário: Mateuszica / Deus ea Matemática
- Использование на yo.wikipedia.org
- Nọ́mbà áljẹ́brà