2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


В этом разделе нельзя создавать новые темы.

Если Вы хотите задать новый вопрос, то не дописывайте его в существующую тему, а создайте новую в корневом разделе "Помогите решить/разобраться (М)".

Если Вы зададите новый вопрос в существующей теме, то в случае нарушения оформления или других правил форума Ваше сообщение и все ответы на него могут быть удалены без предупреждения.

Не ищите на этом форуме халяву, правила запрещают участникам публиковать готовые решения стандартных учебных задач. Автор вопроса обязан привести свои попытки решения и указать конкретные затруднения.

Обязательно просмотрите тему Правила данного раздела, иначе Ваша тема может быть удалена или перемещена в Карантин, а Вы так и не узнаете, почему.



Начать новую тему Ответить на тему
 
 Проверить деление на 3 в двоичной форме программно (grep)
Сообщение19.12.2006, 16:42 


19/12/06
2
Здраствуйте !

Помогите пожалуйста решить вот такую задачку. Надо проверить делимость на три числа в двоичной форме. Сделать это надо с помощью регулярных выражений. Ну скажем с помощью grep ?
Признаки делимости на три я вроде знаю, но вот как применить ? Или такие числа обладают некой регулярностью в записи ? Если обладают то где почитать ?

 Профиль  
                  
 
 
Сообщение19.12.2006, 17:33 
Заслуженный участник


31/12/05
1424
Нужен признак делимости на $3$ для двоичной системы. Их есть два (хотя по сути они одинаковы):

1. Делимость на $2 + 1 = 3$ в двоичной системе - аналог делимости на $10 + 1 = 11$ в десятичной системе, знакопеременная сумма цифр должна делиться на $3$. Например, $75 = 1001011_{2}, 1-0+0-1+0-1+1 = 0$.
2. Делимость на $4 - 1 = 3$ в четверичной системе - аналог делимости на $10 - 1 = 9$ в десятичной системе, сумма двузначных групп двоичного числа должна делиться на $3$. Например, $75 = 1001011_{2}, 1_2+00_2+10_2+11_2 = 6$.

С точки зрения программы, работающей со строкой символов, можно попробовать переформулировать так: поделить строку на группы по две цифры справа налево (дополнить слева нулем, если число цифр нечетно), посчитать число групп "01" и вычесть из него число групп "10". Результат должен делиться на 3. Как реализовать это в регэкспах - не знаю.

 Профиль  
                  
 
 
Сообщение19.12.2006, 18:49 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Не знаю, но я бы пошел другим путем:

1) сделайте конечны автомат, проверяющий делимость числа (как цепочки) на три. В нем три вершины: $S_0$, $S_1$ и $S_2$, соответствующие текущему остатку. Переходы соответствуют приписыванию соответствующей младшей цифры.

2) Переведите его в регулярное выражение (есть конструктивные теоремы об эквивалентности).

 Профиль  
                  
 
 
Сообщение19.12.2006, 19:11 
Заслуженный участник


31/12/05
1424
незваный гость писал(а):
1) сделайте конечны автомат, проверяющий делимость числа (как цепочки) на три.
Ой, а ведь и правда очень просто.

 Профиль  
                  
 
 
Сообщение20.12.2006, 11:53 


19/12/06
2
Идея с конечным автоматом понравилась :) Ей наверное и воспользуюсь. А что это за теоремы об эквивалентности ? Ну то есть конечно интутивно (и по реализации) regexp можно перевести в конечный автомат и наверное наоборот. Но чтобы теорема.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group