Имя: Пароль:
LIFE
 
ОФФ: Задачка на неделю
Ø
0 Ненавижу 1С
 
26.07.05
15:37
есть последовательность заданная формулой
x[n]=f(x[n-1],...,x[n-k]), где f - многочлен от k перемнных. Для простоты возьмем его первой степени. При каких условиях на f последовательность периодическая, независимо от первоначальных k элементов?
Примеры:
x[n]=x[n-1]+x[n-2] - Фибоначи, не периодическая
x[n]=x[n-1]-x[n-2] - периодическая
x[n]=x[n-2]-x[n-1] - не периодическая
x[n]=x[n-1] - периодическая
Как длина периода зависит от f?
1 mes
 
26.07.05
15:39
чего?
2 КонецЦикла
 
26.07.05
15:43
А шо такое многочлен? А Фибоначи?
3 smus
 
26.07.05
15:44
глюцерогены употреблять вредно!
4 urban
 
26.07.05
15:47
ниасилил...
5 ОбезьянаС Гранатой
 
26.07.05
16:05
хотелось бы увидеть определение периодической последовательности.
Я думаю, последовательность А называется периодической, если существует число m такое, что для любого k>m А(k) = A(k-m).
НО последовательность 2 под это определение не подходит... не понимаю!
6 coma
 
26.07.05
16:18
(0)Откуда на форуме 1с. Такие таланты неужели во всем инете нет форумов для типа математиков?
7 Wasya
 
26.07.05
16:20
(6) Типа 1Снику математику знать не надо? Надо только уметь быстро колотить по клавишам?
8 NS
 
26.07.05
16:20
Если линейная, то понятно, что все коэффициенты должны быть равны 0,1, либо -1. Это первое условие.
9 NS
 
26.07.05
16:23
Далее - не может быть двух членов с коэффициентом 1, так же как и двух членов с коэффициентом -1.
10 coma
 
26.07.05
16:23
(7) ну типа в размере средней школы надо. Тезиз матспособности 1С чуть выше мат способностей бухов.
11 NS
 
26.07.05
16:25
Остаются варианты - все коэффициенты равны 0 - период 1.
Один коэффициент 1, остальные 0 - период к.
Один коэффициент -1, остальные 0 - период 2*к;
Один коэффициент 1, и один -1, остальные нули - надо думать.
12 NS
 
26.07.05
16:28
Хотя... возможно лажаюсь...
13 NS
 
26.07.05
16:32
Короче - сумма квадратов коэффициентов должна быть равна единице, либо все коэффициенты должны быть равны нулю. - вот такое первое условие...
Это еще одно просто предположение....
14 NS
 
26.07.05
16:34
Что-то меня переклинило...
15 DeiMos
 
26.07.05
16:35
ИМХО, всё гораздо проще.
Нужно проверить сходимость в пределе.
Любая функция, не являющаяся ни сходящейся, ни расходящейся - является периодической.
16 Ненавижу 1С
 
26.07.05
16:35
(5) определение правильное
x[n]=x[n-1]-x[n-2] - периодическая, потому что:
a,b,b-a,-a,-b,a-b,a,b,....
17 Wasya
 
26.07.05
16:43
А практическое применение у этой задачи есть?
18 Ненавижу 1С
 
26.07.05
16:45
не всегда коэф. единицы, например
x[n]=sqrt(2)*x[n-1]-x[n-2] - периодическая, период 8
19 Ненавижу 1С
 
26.07.05
16:50
(17) не знаю, мне просто нравится решать задачи
20 NS
 
26.07.05
16:56
(18) какая же она периодическая...
Чушь сказал.
21 NS
 
26.07.05
17:00
Прикольно, но периодическая.
22 NS
 
26.07.05
17:07
(0) Уверен, что задача решается аналитически, без перебора?
Похожая задача была на сборах на союз. Но там выдавалась последовательность, и надо было найти её периодическую часть и длину периода.
23 Ненавижу 1С
 
26.07.05
17:20
(22) Не знаю, у меня есть только гепотеза
24 mes
 
26.07.05
17:28
блин, вы такие все умные. вам бы ракеты строить, а не в 1се копатся. Оставили бы это уж лучше нам - экономистам
25 NS
 
26.07.05
17:33
(23) Перебором решается достаточно легко - могу к вечеру набрасать модуль, но есно в случае иррациональностей (SQR(2)) - ничего не выйдет из-за ошибок округления.
26 Mitrich
 
26.07.05
17:36
(24) Не тронь математиков и физиков! Они нам, инженерам, жизнь облегчают.
27 NS
 
26.07.05
19:48
Всё, решил математически - всё очень просто.
28 NS
 
26.07.05
20:03
Короче - представим последовательность из N элементов в виде вектора.
Следующее значение вектора Xнов=А*Хпред, где а-матрица преобразования.
Матрица имеет вид -
01000...
00100...
00010...
........
abcde,
где a,b,c,d,e - коэффициенты. для х(N-k),x(n-k+1) и т.д.
29 NS
 
26.07.05
21:31
Какой-то у меня монолог получаетася ;-)
Короче, если мы возведением матрицы в некоторую степень получим матрицу, у которой все элементы равны нулю, кроме нскольких (хоть всех) диагональных, которые, кроме нуля могут равнятся единице, либо единицы, значит цикл есть. причем, если возведением в эту степень (n) мы получаем единичную матрицу, значит цикл равен степени (n), если на диагонали единицы и нули, то через n итераций входим в цикл длиной n(при этом, после n операций обнулятся некоторые элементы, и дальше будет чистый цикл)
Если на диагонали есть элементы (-1), то понятно, что дальнейшим возведением матрицы в квадрат мы получим матрицу с единицами и нулями по диагонали, соответственно цикл равен n*2, и если на диагонали есть нули, то в цикл войдет только через n итераций.
Если получили матрицу нулевую, то цикл равен единицы (обнулятся все элементы)
Это решение.
...................................
теперь замечание:
понятно, что дискриминант исходной матрицы должен быть равен нулю, единице, либо минус единицы.
......
Сейчас будет программа.
30 NS
 
26.07.05
21:34
Тьфу. Имелся в виду определитель.
31 Эстет хренов
 
26.07.05
21:39
(28)
Собственно, в общем случае, f() - непрерывный, ограниченый оператор вида: А(x):Rk -> Rk
В идеале, нужно найти все такие операторы, чтобы A(-m)=I имело решение.
Для линейного можно решить, если вспомнить функан.
 
32 NS
 
26.07.05
21:49
Ничего не надо вспоминать. Нужно посчитать определитель, а затем возводить в степень.
Иначе не проверить является ли матрица корнем единичной (либо единичной с единицами замененными на нули)
Программа:
33 NS
 
26.07.05
21:53
// считать определитель перед расчетом стало влом
// он должен быть равен 0,1, либо -1, иначе цикл невозможен.
Процедура ВывестиМатрицу(К,А[])
  перем стр,м,н;
  сообщить("");
  Для м=1 по к цикл
    стр="";
    Для н=1 по к цикл
      стр=стр+Формат(а[м*к+н],"ч12.4,");
    КонецЦикла;
    сообщить(стр);
  КонецЦикла;
  сообщить("");
КонецПроцедуры
Процедура НайтиЦикл(к,х[])
  перем а[1000],ан[1000],тмп[1000];
  макстранзакций=500;
  Округление=7;
  Погрешность=0.00000001;
  // соорудим матрицу
  Для м=1 по к цикл
    Для н=1 по к цикл
      а[м*к+н]=0;
    КонецЦикла;
  КонецЦикла;
  Для м=1 по к-1 цикл
    а[м*к+м+1]=1;
  КонецЦикла;
  Для м=1 по к цикл
    а[к*к+м]=х[м];
  КонецЦикла;
  ВывестиМатрицу(к,а);
  // соорудим единичную матрицу
  Для м=1 по к цикл
    Для н=1 по к цикл
      ан[м*к+н]=0;
    КонецЦикла;
  КонецЦикла;
  Для м=1 по к цикл
    ан[м*к+м]=1;
  конеццикла;
  
  Транзакция=0;
  Флаг=0;
  Пока (транзакция<макстранзакций) и (флаг=0) цикл
    Транзакция=Транзакция+1;
    сообщить(" ++++++ "+Транзакция+" ++++++++ ");
    сообщить("");
    // подготовим пустую матрицу
    Для м=1 по к цикл
      Для н=1 по к цикл
        тмп[м*к+н]=0;
      КонецЦикла;
    КонецЦикла;
    // перемножим матрицы
    Для м=1 по к цикл
      Для н=1 по к цикл
        Для о=1 по к цикл
          тмп[м*к+о]=тмп[м*к+о]+окр(а[м*к+н]*ан[н*к+о],округление);
        КонецЦикла;
      КонецЦикла;
    КонецЦикла;
    ВывестиМатрицу(к,тмп);
    // проверим результат
    Флаг=1;
    ЕстьНулиНаДиагонали=0;
    ЕстьОтрицательныеНаДиагонали=0;
    ЕстьПоложительныеНаДиагонали=0;
    Для м=1 по к цикл
      Для н=1 по к цикл
        рез=тмп[м*к+н];
        Если м=н тогда
          Если рез*рез<=погрешность Тогда
            ЕстьНулиНаДиагонали=1;
          ИначеЕсли Рез>0 тогда
            рез=рез-1;
            ЕстьПоложительныеНаДиагонали=1;
          Иначе
            рез=рез+1;
            ЕстьОтрицательныеНаДиагонали=1;
          КонецЕсли;
        КонецЕсли;
        Если рез*рез>Погрешность Тогда
          Флаг=0;
          прервать;
        КонецЕсли;
      КонецЦикла;
      Если Флаг=0 Тогда
        прервать;
      КонецЕсли;
    КонецЦикла;
    Если Флаг=0 Тогда
      // скопируем матрицу
      Для м=1 по к цикл
        Для н=1 по к цикл
          ан[м*к+н]=тмп[м*к+н];
        КонецЦикла;
      КонецЦикла;
    КонецЕсли;
  КонецЦикла;
  Если Флаг=0 Тогда
    сообщить("Цикл не найден");
  Иначе
    Если ЕстьНулиНаДиагонали=1 Тогда
      сообщить("цикл начнется через "+Транзакция+" Итераций");
    КонецЕсли;
    Если ЕстьОтрицательныеНаДиагонали=1 тогда
      Транзакция=Транзакция*2;
    ИначеЕсли ЕстьПоложительныеНаДиагонали=0 Тогда
      Транзакция=1;
    КонецЕсли;
    сообщить("цикл содержит в себе "+Транзакция+" Итераций");
  КонецЕсли;
КонецПроцедуры
Процедура Сформировать()
  перем х[100];
  к=2;
  х[1]=-1;
  х[2]=1.41421356;
  найтицикл(к,х);
  х[1]=-1;
  х[2]=1;
  найтицикл(к,х);
  х[1]=1;
  х[2]=0;
  найтицикл(к,х);
КонецПроцедуры
решение с парой изъянов.
1) влом стало считать определитель.
2) найдите сами неточность.
34 NS
 
26.07.05
22:27
Короче - что за неточность - я знаю, и как исправлять то-же.
Остальным пища для размышлений...
35 NS
 
27.07.05
00:27
никто не хочет состязаться ;-)
Ошибка была в ведущих нулях.
Вариант с заплаткой ниже.
Определитель не считается - так как это очень длительная операция на больших матрицах.
// вариант с заплаткой, очень влом писать нормально.
Процедура ВывестиМатрицу(К,А[])
  перем стр,м,н;
  сообщить("");
  Для м=1 по к цикл
    стр="";
    Для н=1 по к цикл
      стр=стр+Формат(а[м*к+н],"ч12.4,");
    КонецЦикла;
    сообщить(стр);
  КонецЦикла;
  сообщить("");
КонецПроцедуры
Процедура НайтиЦикл(знач к,х[])
  перем а[1000],ан[1000],тмп[1000];
  макстранзакций=100;
  Округление=7;
  Погрешность=0.00000001;
  // заплатка для начальных нулей
  пока 1<=к цикл
    Если х[1]=0 Тогда
      Для н=1 по к-1 цикл
        х[н]=х[н+1];
      конеццикла;
      к=к-1;
    иначе
      прервать;
    КонецЕсли;
  КонецЦикла;
  // соорудим матрицу
  Для м=1 по к цикл
    Для н=1 по к цикл
      а[м*к+н]=0;
    КонецЦикла;
  КонецЦикла;
  Для м=1 по к-1 цикл
    а[м*к+м+1]=1;
  КонецЦикла;
  Для м=1 по к цикл
    а[к*к+м]=х[м];
  КонецЦикла;
  ВывестиМатрицу(к,а);
  // соорудим единичную матрицу
  Для м=1 по к цикл
    Для н=1 по к цикл
      ан[м*к+н]=0;
    КонецЦикла;
  КонецЦикла;
  Для м=1 по к цикл
    ан[м*к+м]=1;
  конеццикла;
  
  Транзакция=0;
  Флаг=0;
  Пока (транзакция<макстранзакций) и (флаг=0) цикл
    Транзакция=Транзакция+1;
    сообщить(" ++++++ "+Транзакция+" ++++++++ ");
    сообщить("");
    // подготовим пустую матрицу
    Для м=1 по к цикл
      Для н=1 по к цикл
        тмп[м*к+н]=0;
      КонецЦикла;
    КонецЦикла;
    // перемножим матрицы
    Для м=1 по к цикл
      Для н=1 по к цикл
        Для о=1 по к цикл
          тмп[м*к+о]=тмп[м*к+о]+окр(а[м*к+н]*ан[н*к+о],округление);
        КонецЦикла;
      КонецЦикла;
    КонецЦикла;
    ВывестиМатрицу(к,тмп);
    // проверим результат
    Флаг=1;
    ЕстьНулиНаДиагонали=0;
    ЕстьОтрицательныеНаДиагонали=0;
    ЕстьПоложительныеНаДиагонали=0;
    Для м=1 по к цикл
      Для н=1 по к цикл
        рез=тмп[м*к+н];
        Если м=н тогда
          Если рез*рез<=погрешность Тогда
            ЕстьНулиНаДиагонали=1;
          ИначеЕсли Рез>0 тогда
            рез=рез-1;
            ЕстьПоложительныеНаДиагонали=1;
          Иначе
            рез=рез+1;
            ЕстьОтрицательныеНаДиагонали=1;
          КонецЕсли;
        КонецЕсли;
        Если рез*рез>Погрешность Тогда
          Флаг=0;
          прервать;
        КонецЕсли;
      КонецЦикла;
      Если Флаг=0 Тогда
        прервать;
      КонецЕсли;
    КонецЦикла;
    Если Флаг=0 Тогда
      // скопируем матрицу
      Для м=1 по к цикл
        Для н=1 по к цикл
          ан[м*к+н]=тмп[м*к+н];
        КонецЦикла;
      КонецЦикла;
    КонецЕсли;
  КонецЦикла;
  Если Флаг=0 Тогда
    сообщить("Цикл не найден");
  Иначе
    Если ЕстьНулиНаДиагонали=1 Тогда
      сообщить("цикл начнется через "+Транзакция+" Итераций");
    КонецЕсли;
    Если ЕстьОтрицательныеНаДиагонали=1 тогда
      Транзакция=Транзакция*2;
    ИначеЕсли ЕстьПоложительныеНаДиагонали=0 Тогда
      Транзакция=1;
    КонецЕсли;
    сообщить("цикл содержит в себе "+Транзакция+" Итераций");
  КонецЕсли;
КонецПроцедуры
Процедура Сформировать()
  перем х[100];
  к=2;
  х[1]=-1;
  х[2]=1.41421356;
  найтицикл(к,х);
  х[1]=-1;
  х[2]=1;
  найтицикл(к,х);
  к=10;
  х[1]=-1;
  х[2]=1;
  х[3]=-1;
  х[4]=1;
  х[5]=-1;
  х[6]=1;
  х[7]=-1;
  х[8]=1;
  х[9]=-1;
  х[10]=1;
  найтицикл(к,х);
  к=3;
  х[1]=0;
  х[2]=-1;
  х[3]=0;
  найтицикл(к,х);
  к=4;
  х[1]=0;
  х[2]=0;
  х[3]=0;
  х[4]=0;
  найтицикл(к,х);
КонецПроцедуры
36 DeiMos
 
27.07.05
00:35
Много букаффф.
Ни асилил...
 
Господи, какой же я старый и ленивый...
В 1993-м году окончил с красным дипломом Университет по специальности "Автоматизация управления в технических системах".
Спутники орбитальные рассчитывали...
Системы диф. уравнений...
Сейчас смотрю на эти матрицы, определители, рисуемые NS-ом... - тошнит...
 
Примерно то же самое, что в бассейне проводил с 3-го класса по 2 часа в день... Был чемпионом республики по современному пятиборью...
Сейчас посмотрю на воду - тошнит... Не то что спортивно плавать - просто купаться - не хочется...
37 NS
 
27.07.05
00:44
(36) Тебя тошнит, а меня клинит ;-) в матрице одни нули, и определитель равен первому коэффициенту.
При отбрасывании начальных нулевых коэффициентов. Первый, не нулевой должен быть равен единице, либо минус единице. Вот и всех делов (ежели первый не единица - ес-но ряд никогда не зациклится.)
Чичас склею еще одну заплатку.
38 kos
 
27.07.05
00:46
реально тошнит....
39 NS
 
27.07.05
00:47
Процедура ВывестиМатрицу(К,А[])
  перем стр,м,н;
  сообщить("");
  Для м=1 по к цикл
    стр="";
    Для н=1 по к цикл
      стр=стр+Формат(а[м*к+н],"ч12.4,");
    КонецЦикла;
    сообщить(стр);
  КонецЦикла;
  сообщить("");
КонецПроцедуры
Процедура НайтиЦикл(знач к,х[])
  перем а[1000],ан[1000],тмп[1000];
  макстранзакций=100;
  Округление=7;
  Погрешность=0.00000001;
  сообщить("");
  Для м=1 по к цикл
    сообщить(х[м]);
  КонецЦикла;
  Сообщить("посчитаем...");
  // заплатка для начальных нулей
  пока 1<=к цикл
    Если х[1]=0 Тогда
      Для н=1 по к-1 цикл
        х[н]=х[н+1];
      конеццикла;
      к=к-1;
    иначе
      прервать;
    КонецЕсли;
  КонецЦикла;
  // Заплатка по определителю
  Если к=0 Тогда
    сообщить("ряд сразу занулится, период равен единице");
    возврат;
  Иначеесли (х[1]<>1)и(х[1]<>-1) Тогда
    сообщить("Определитель матрицы по модулю не равен единице, ряд не может зациклиться");
    возврат;
  КонецЕсли;
  // соорудим матрицу
  Для м=1 по к цикл
    Для н=1 по к цикл
      а[м*к+н]=0;
    КонецЦикла;
  КонецЦикла;
  Для м=1 по к-1 цикл
    а[м*к+м+1]=1;
  КонецЦикла;
  Для м=1 по к цикл
    а[к*к+м]=х[м];
  КонецЦикла;
  ВывестиМатрицу(к,а);
  // соорудим единичную матрицу
  Для м=1 по к цикл
    Для н=1 по к цикл
      ан[м*к+н]=0;
    КонецЦикла;
  КонецЦикла;
  Для м=1 по к цикл
    ан[м*к+м]=1;
  конеццикла;
  
  Транзакция=0;
  Флаг=0;
  Пока (транзакция<макстранзакций) и (флаг=0) цикл
    Транзакция=Транзакция+1;
    сообщить(" ++++++ "+Транзакция+" ++++++++ ");
    сообщить("");
    // подготовим пустую матрицу
    Для м=1 по к цикл
      Для н=1 по к цикл
        тмп[м*к+н]=0;
      КонецЦикла;
    КонецЦикла;
    // перемножим матрицы
    Для м=1 по к цикл
      Для н=1 по к цикл
        Для о=1 по к цикл
          тмп[м*к+о]=тмп[м*к+о]+окр(а[м*к+н]*ан[н*к+о],округление);
        КонецЦикла;
      КонецЦикла;
    КонецЦикла;
    ВывестиМатрицу(к,тмп);
    // проверим результат
    Флаг=1;
    ЕстьНулиНаДиагонали=0;
    ЕстьОтрицательныеНаДиагонали=0;
    ЕстьПоложительныеНаДиагонали=0;
    Для м=1 по к цикл
      Для н=1 по к цикл
        рез=тмп[м*к+н];
        Если м=н тогда
          Если рез*рез<=погрешность Тогда
            ЕстьНулиНаДиагонали=1;
          ИначеЕсли Рез>0 тогда
            рез=рез-1;
            ЕстьПоложительныеНаДиагонали=1;
          Иначе
            рез=рез+1;
            ЕстьОтрицательныеНаДиагонали=1;
          КонецЕсли;
        КонецЕсли;
        Если рез*рез>Погрешность Тогда
          Флаг=0;
          прервать;
        КонецЕсли;
      КонецЦикла;
      Если Флаг=0 Тогда
        прервать;
      КонецЕсли;
    КонецЦикла;
    Если Флаг=0 Тогда
      // скопируем матрицу
      Для м=1 по к цикл
        Для н=1 по к цикл
          ан[м*к+н]=тмп[м*к+н];
        КонецЦикла;
      КонецЦикла;
    КонецЕсли;
  КонецЦикла;
  Если Флаг=0 Тогда
    сообщить("Цикл не найден");
  Иначе
    Если ЕстьНулиНаДиагонали=1 Тогда
      сообщить("цикл начнется через "+Транзакция+" Итераций");
    КонецЕсли;
    Если ЕстьОтрицательныеНаДиагонали=1 тогда
      Транзакция=Транзакция*2;
    ИначеЕсли ЕстьПоложительныеНаДиагонали=0 Тогда
      Транзакция=1;
    КонецЕсли;
    сообщить("цикл содержит в себе "+Транзакция+" Итераций");
  КонецЕсли;
КонецПроцедуры
Процедура Сформировать()
  перем х[100];
  к=2;
  х[1]=-1;
  х[2]=1.41421356;
  найтицикл(к,х);
  х[1]=-1;
  х[2]=1;
  найтицикл(к,х);
  к=10;
  х[1]=-1;
  х[2]=1;
  х[3]=-1;
  х[4]=1;
  х[5]=-1;
  х[6]=1;
  х[7]=-1;
  х[8]=1;
  х[9]=-1;
  х[10]=1;
  найтицикл(к,х);
  к=3;
  х[1]=0;
  х[2]=-1;
  х[3]=0;
  найтицикл(к,х);
  к=4;
  х[1]=2;
  х[2]=0;
  х[3]=1;
  х[4]=0;
  найтицикл(к,х);
  к=1;
  х[1]=0;
  найтицикл(к,х);
КонецПроцедуры
40 Wasya
 
27.07.05
08:37
//*******************************************
Функция ПроверитьМассив(к,х[])
  Статус="Начало";
  Для Инд=1 По к Цикл
    Если Статус="Начало" Тогда
      Если х[Инд]=1 Тогда
        Статус="Единица";
      ИначеЕсли х[Инд]=0 Тогда
        Статус="Ноль";
      Иначе
        Возврат 0;
      КонецЕсли;
    ИначеЕсли Статус="Единица" Тогда
      Если х[Инд]<>0 Тогда
        Возврат 0;
      КонецЕсли;
    ИначеЕсли Статус="Ноль" Тогда
      Если х[Инд]=0 Тогда
      ИначеЕсли х[Инд]=1 Тогда
        Статус="Единица";
      Иначе
        Возврат 0;
      КонецЕсли;
    КонецЕсли;
  КонецЦикла;
  Возврат 1;
КонецФункции
//*******************************************
Процедура ПребразоватьМассив(к,х[],y[])
  База=y[1];
  Для Инд=1 По к-1 Цикл
    y[Инд]=y[Инд+1]+База*х[Инд];
  КонецЦикла;
  y[к]=х[к]*База;
КонецПроцедуры
//*******************************************
Процедура НайтиЦикл(к,х[])
  перем y[100];
  Для Инд=1 По к Цикл
    y[Инд]=х[Инд];
  КонецЦикла;
  Для Инд=1 По 1000 Цикл
    Если ПроверитьМассив(к,y)=1 Тогда
      Сообщить("Есть "+Инд);
      Возврат;
    КонецЕсли;
    ПребразоватьМассив(к,х,y);
  КонецЦикла;
  Сообщить("Нет ");
КонецПроцедуры
//*******************************************
Процедура Сформировать()
  перем х[100];
  х[1]=-1;
  х[2]=1.41421356;
  найтицикл(2,х);
  х[1]=-1;
  х[2]=1;
  найтицикл(2,х);
  х[1]=1;
  х[2]=-1;
  найтицикл(2,х);
  х[1]=1;
  найтицикл(1,х);
КонецПроцедуры
41 NS
 
27.07.05
10:42
Что-то я начинаю вспоминать....
Возведением какой-то матрицы в степень мы по диагонали получаем гл. собственный вектор....
и соответственно он где-то должен быть единичным....
если я не ошибаюсь...
42 Tereann
 
27.07.05
11:17
(41) Тебе зачем? Ты откуда?
43 NS
 
27.07.05
11:21
Что зачем? В смысле откуда?
44 Tereann
 
27.07.05
11:23
Зачем - в смысле зачем эта задачка, для чего,так сказать, решить ее пытаешься.
Откуда - в смысле если учишься, то где.
45 NS
 
27.07.05
11:26
(0) Задал - мне стало интересно.
Я давно уже вышел из того возраста, когда учатся...
Во всяком случае, когда спрашивают, где учишься.
46 NS
 
27.07.05
11:32
(40) Есно у тебя неверно.
47 NS
 
27.07.05
15:27
Неужели больше никому неинтересно?
Может проще можно решить?
48 Ненавижу 1С
 
27.07.05
16:41
Придумал!
для формулы x[n]=f(x[n-1],...,x[n-k])=C[1]*x[n-1]+...+C[k]*x[n-k] (рассматривал только однородный случай) построим характеристическое уравнение t^k=C[1]*t^(k-1)+...+C[k-1]*t+C[k]. Последовательность удовлетворяющее условию формулы будет периодической независимо от первых k членов, тогда и только тогда, когда корнями характеристического уравнения являются попарно различные корни из 1 (в т.ч. комплексные). Длина периода равна НОК наименьших степеней в которых эти корни уравнения дают 1.
49 NS
 
27.07.05
16:45
(48) Не факт, что это так...
как ты будешь находить все корни уравнения охрененной степени?
или будешь подставлять все корни из единицы?
Где доказательство, что это правильно?
50 NS
 
27.07.05
16:48
x^2=-х+sqrt(2) - уже не подходит.
51 Ненавижу 1С
 
27.07.05
17:02
(49) корни искать действительно не просто. надо подумать, возможно для определения периодичности достаточно проверять необходимые но не достаточные условия (например |С[k]|=1).
(50) конечно не катит, надо для x[n]=sqrt(2)*x[n-1]-x[n-2] рассматривать x^2=sqrt(2)*х-1.
Сейчас попробую выложить доказательство.
52 mes
 
27.07.05
17:08
мда... народ вам че, занятся нечем?
хотя завидую. белой завистью. когда-то и вот так мог. а сейчас: Дебет Кредет плюс минус умножить разделить. ээх
53 NS
 
27.07.05
17:17
А не проще ли (39) В нормальный вид привести? Работает очень быстро.
54 Ненавижу 1С
 
27.07.05
17:25
не вдавался в (39), опиши словами как работает алгоритм
55 Uotze Phuck
 
27.07.05
17:32
ПРОСНИТЕСЬ
МАТРИЦА ВАС ИМЕЕТ!!!
56 kasrpi
 
27.07.05
17:40
мля, ребяты, а с кем это вы сейчас разговаривали ... :)
57 Ненавижу 1С
 
27.07.05
17:43
Доказательство для (48)
Рассмотрим отображение сдвига A:(x[n-1],...,x[n-k])->(x[n],...,x[n-k+1]). Его матрица (тоже A) выглядит так:
C[1] . . . . C[k]
   1 0 0 . . 0
   0 1 0 . . 0
   . . . . . .
   0 . . 0 1 0
характеристическое уравнение для нее t^k=C[1]*t^(k-1)+..+C[k-1]*t+C[k]. Понятно, что если последовательность периодическая с периодом P, то A^P=E - единичная матрица. Перейдем к жордановому базису (матрица в нем A*: (A*)^P=E). Если t[1],...,t[n] - корни характеристического многочлена, то t[1]^P=...=t[n]^P=1.
58 NS
 
27.07.05
17:48
(54) Удаляются в коэффициентах начальные нули, первый проверяется на равенство 1/-1, если равен - строится матрица (28), затем она последовательно возводится в степень, с ограничением на количество умножений.
Как только матрица становится пустой, кроме диагональных элементов.
И на диагонали только 1 и -1 - значит цикл есть.
если на диагонали только единицы - значит цикл равен степени, если есть минус единицы - значит цикл равен степени умноженной на 2 (при возведении в квадрат получаем единичную матрицу). В алгоритме делается поправка на погрешность результата (например для случая коэффициента равного корню из двух)
начальная матрица А строится таким образом
что если Х=
x1
x2
x3
.
.
то Ах=
х2
х3
х4
.
.
В алгоритме остались ошметки на проверку на нули на диагонали - но эта проверка не нужна, так как определитель матрицы всегда равен единице, либо -1 (и не может быть равен нулю)
59 NS
 
27.07.05
17:52
(57) возведение матрицы в степень и проверка на единичную проще, чем решение уравнения N-ой степени. Тем более, что нормальных методов для определения всех корней не существует.
Хотя метод подстановки всех корней из единицы - имеет право на существование.
60 Uotze Phuck
 
27.07.05
17:57
Не взлетит!
Нельзя разогнать воздух относительно крылев!
61 Ненавижу 1С
 
28.07.05
09:03
А как быть с неоднородным случаем, то есть когда f(0,...,0)<>0
62 NS
 
28.07.05
09:39
(61) Сейчас подумаю.
63 NS
 
28.07.05
09:48
В случае начального нулевого вектора -
хнов=Ах+в;
в=(0,0,0,0,...,1) после нескольких итераций
хнов=А*А*А*А*А....*А*в
хнов должен быть нулевым.
соответственно определитель А должен быть равен нулю ли бо нулевым должен быть вектор в.
Исходя из структуры матрицы А - либо все её коэффициенты должны быть равны нулю, соответственно вектор в тоже должен быть нулевым, либо изначально вектор в должен быть нулевым.
64 Ненавижу 1С
 
28.07.05
09:55
(63) а вот такая последовательность:
x[n]=C-x[n-1]
65 NS
 
28.07.05
09:55
опять похоже лажу сказал...
66 NS
 
28.07.05
10:11
(63,64) Еще не проснулся. Надо думать.
67 Ненавижу 1С
 
28.07.05
10:15
Единственное что пришло в голову:
1. однородная часть f должна удовлетворять условию (48) также
2. матрица A^(n-1)+A^(n-2)+...+A+E должна обнулять вектор (1,0,...,0), то есть ее первый столбец должен быть нулевым.
Однако, может оказаться так, что для 1 и 2 условия значения n могут оказаться разными :-(
68 Ненавижу 1С
 
28.07.05
10:39
(67) Как следствие: если последовательность циклична при некотором ненулевом свободном члене, то она циклична при любом свободном члене.
69 NS
 
28.07.05
10:42
Вот это точно не так.
последовательность
х(N+1)=х(N)+1 разве циклична?
70 Ненавижу 1С
 
28.07.05
10:48
(69) естественно нет, 2-е условие не выполняется: матрица A+E=(1)+(1)=(2) не обнуляет вектор (1). Для одной переменной справа это очевидно только последовательности вида (64)
71 Ненавижу 1С
 
28.07.05
11:12
Интересует также и обратная задача:
верно ли что ля любой периодической последовательности найдется (возможно даже однородный) многочлен первой степени f для которого верно x[n]=f(x[n-1],...,x[n-k]).
72 Wasya
 
28.07.05
11:12
(46) Почему?
73 NS
 
28.07.05
11:28
(72) потому, что даже длину цикла неправильную выдает.
-1,1,-1,1 должно быть 10. на тестовых примерах - тоже неправильная длина.
74 Wasya
 
28.07.05
12:12
//*******************************************
Функция ПроверитьМассив(к,х[])
  Статус="Начало";
  Един=0;
  Для Инд=1 По к Цикл
    Если Статус="Начало" Тогда
      Если х[Инд]=1 Тогда
        Статус="Единица";
        Един=Инд;
      ИначеЕсли х[Инд]=0 Тогда
        Статус="Ноль";
      Иначе
        Возврат 0;
      КонецЕсли;
    ИначеЕсли Статус="Единица" Тогда
      Если х[Инд]<>0 Тогда
        Возврат 0;
      КонецЕсли;
    ИначеЕсли Статус="Ноль" Тогда
      Если х[Инд]=0 Тогда
      ИначеЕсли х[Инд]=1 Тогда
        Статус="Единица";
        Един=Инд;
      Иначе
        Возврат 0;
      КонецЕсли;
    КонецЕсли;
  КонецЦикла;
  Возврат Един;
КонецФункции
//*******************************************
Процедура ПребразоватьМассив(к,х[],y[])
  Округление=7;
  База=y[1];
  Для Инд=1 По к-1 Цикл
    y[Инд]=y[Инд+1]+Окр(База*х[Инд],Округление);
  КонецЦикла;
  y[к]=Окр(х[к]*База,Округление);
КонецПроцедуры
//*******************************************
Процедура НайтиЦикл(к,х[])
  перем y[100];
  Для Инд=1 По к Цикл
    y[Инд]=х[Инд];
  КонецЦикла;
  Для Инд=1 По 1000 Цикл
    Рез=ПроверитьМассив(к,y);
    Если Рез<>0 Тогда
      Сообщить("Есть "+(Инд+Рез-1));
      Возврат;
    КонецЕсли;
    ПребразоватьМассив(к,х,y);
  КонецЦикла;
  Сообщить("Нет ");
КонецПроцедуры
//*******************************************
Процедура Сформировать()
  перем х[100];
  к=2;
  х[2]=-1;
  х[1]=1.41421356;
  найтицикл(к,х);
 х[2]=-1;
  х[1]=1;
  найтицикл(к,х);
  к=10;
  х[10]=-1;
  х[9]=1;
  х[8]=-1;
  х[7]=1;
  х[6]=-1;
  х[5]=1;
  х[4]=-1;
  х[3]=1;
  х[2]=-1;
  х[1]=1;
  найтицикл(к,х);
  к=3;
  х[3]=0;
  х[2]=-1;
  х[1]=0;
  найтицикл(к,х);
  к=4;
  х[4]=2;
  х[3]=0;
  х[2]=1;
  х[1]=0;
  найтицикл(к,х);
  к=1;
  х[1]=1;
  найтицикл(к,х);
  к=4;
  х[4]=-1;
  х[3]=1;
  х[2]=-1;
  х[1]=1;
  найтицикл(к,х);
КонецПроцедуры
75 Wasya
 
28.07.05
14:49
Алгоритм (74) работает верно, если верно утверждение:
равенство K1*X1+K2*X2+…+Kn*Xn=0 выполняется для любых чисел X1,X2,…,Xn тогда и только тогда когда K1=K2=…=Kn=0.
76 NS
 
28.07.05
15:23
а что такое К и что такое Х ?
работает вроде верно. И быстро.
77 Wasya
 
28.07.05
15:42
Обоснование алгоритма.
x[n]=f(x[n-1],...,x[n-k]) подставим значение x[n-1]. Получим x[n]=f1(x[n-2],...,x[n-k-1]). Повторим эту процедуру. x[n]=fi(x[n-1-i],...,x[n-k-i]).
Свойства полученных многочленов:
1. по-прежнему многочлен от k перемнных
2. для набора x[n-1-i],...,x[n-k-i] fi единственный многочлен. Других нет! Это следует из (75). А (75) верно.
Если на какой то итерации мы получим fi с нулевыми коэффициентами, кроме одного, который равен единице. То x[n]= x[n-i-ПозЕдиницы], для любых начальных значений последовательности. Соответственно последовательность периодическая.
78 Ненавижу 1С
 
28.07.05
16:43
К (71) все просто слишком, для цикла длины T формула x[n]=x[n-T]
79 Wasya
 
29.07.05
07:09
(78) Все очень даже не просто.
Обратная задача. Пусть k[1],…k[k], коэффициенты в f(x[n-1],...,x[n-k]). Необходимо найти такие k[1],…k[k], что бы после I итераций fi(x[n-1-i],...,x[n-k-i])= x[n-k-i].
Примеры:
1. Пусть k=2 i=1. Получаем систему уравнений: k[1]^2+ k[2]=0 и k[1]* k[2]=1. Решение: k[1]=-1, k[2]=-1.
2. Пусть k=2 i=2. Получаем систему уравнений: k[1]^3+ 2*k[1]*k[2]=0 и k[1]^2* k[2]+ k[2]^2=1. Решение: нет.
3. Пусть k=2 i=3. Получаем систему уравнений: k[1]^4+ 3*k[1]^2*k[2]+ k[2]^2=0 и k[1]^3* k[2]+ 2*k[1]*k[2]^2=1. Решение: не знаю.
В общем случае надо решать систему уравнений:
h1(k[1],…, k[k])=0
………………..
hk(k[1],…, k[k])=1
Причем h1,hk это многочлены далеко не первой степени.
PS интересно как был найден пример (sqrt(2),-1)
80 Ненавижу 1С
 
29.07.05
08:48
(79) пример найден благодаря теореме из (48) достаточно взять корень 8 степени из 1 и его сопряженный и построить многочлен
81 Ненавижу 1С
 
29.07.05
08:51
(79) ты хочешь сказать что пример в (78) не удовлетворяет произвольной периодической последовательности?
82 Wasya
 
29.07.05
09:05
Это не единственное решение. ИМХО самое не интересное. (79) это соображения как найти все решения. Т.е. построить таблицу "Брадиса". МножествоРешений(k,t), где k количество переменных в искомом многочлене f(x[n-1],...,x[n-k]), t период периодической последовательности порожденной f(x[n-1],...,x[n-k].
Очевидно, что МножествоРешений(k,t) для каждого k,t конечно.
83 Wasya
 
29.07.05
09:11
(82) получилось заумно.
МножествоРешений(k,t) это множество f(x[n-1],...,x[n-k]) от k переменных пораждающих последовательность с периодом t.
84 Ненавижу 1С
 
29.07.05
09:35
МножествоРешений(t) = МножествоРешений(1,t) + МножествоРешений(2,t) + ...
Очевидно из (48) k<=t, поэтому
МножествоРешений(t) = МножествоРешений(1,t) + ... + МножествоРешений(k,t)
МножествоРешений(i,t) получается полным перебором попарно различных корней из 1, таких что НОК их степеней равна t.
 
85 Ненавижу 1С
 
29.07.05
10:05
Таблица всевозможных последовательностей (в поле действительных чисел)данного периода:
период 1:
x[n]=x[n-1]
период 2:
x[n]=x[n-2]
x[n]=-x[n-1]+С
период 3:
x[n]=x[n-3]
x[n]=-x[n-1]-x[n-2]+С
86 Ненавижу 1С
 
29.07.05
10:14
период 4:
x[n]=x[n-4]
x[n]=-x[n-2]+C
x[n]=x[n-1]-x[n-2]+x[n-3]
x[n]=-x[n-1]-x[n-2]-x[n-3]+C
87 Ненавижу 1С
 
29.07.05
10:18
разумеется x[n]=C тоже периода 1
88 andrewalexk
 
29.07.05
10:20
:))
увлеченные люди...
который день обсуждают тему...
начитаются Мартина Гарднера и Дьюдени и ....
89 Ненавижу 1С
 
29.07.05
10:24
периода 5:
вломы высчитывать коэффициенты, скажу только что получается 6 многочленов
90 Ненавижу 1С
 
29.07.05
10:33
Жаль нет Maple. периода 6 - 10 многочленов.
91 Ненавижу 1С
 
29.07.05
10:41
период 7 - 14 многочленов
92 Ненавижу 1С
 
29.07.05
10:44
монолог...
период 8 - 24 многочлена
93 Ненавижу 1С
 
29.07.05
11:29
думаю тема свернута, придумаю новую задачку о последовательностях
94 Wasya
 
29.07.05
11:31
Спасибо автору за бесцельно потраченное время!
95 Bot
 
29.07.05
11:33
(93) да нет, что ты... Не вздумай закрывать эту тему. Весьма интерессно... Ща тока мозги соберу с пола.... )))
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.