Все дело в нуклеотидах. Их
последовательное соединение в цепочке ДНК определяет всю информацию. А
чем, скажете вы, это может быть похоже на биты, байты, вобщем на Данные?
Все очень просто! Принцип комплементарности (дополнения) - основа ДНК.
Нуклеотиды соединены парами А-Т
и G-C
то есть
напротив Аденина(А) всегда
Тимин(Т), напротив Гуанина(G)
всегда
будет стоять Цитозин(C).
Это означает, что противоположная цепочка
ДНК будет копией своей второй цепи, только инвертированной! Таким образом
Т - инверсия от А, С инверсия от G. Как 0 и 1, 1 и 0.
Просто?
Почти! Да только пары АТ и GC нельзя расматривать как биты, их нужно рассматривать
как пару бит! А = 01(binary) и комплементарный ему Т = 10, G = 00 и С =
11
Название нуклеотида | Кодовое сокращение | Двоичный эквивалент |
|
|
|
|
|
|
|
|
|
|
|
|
Для примера возмем 1 байт = 145, в двоичной системе = 10010001 и запишем его в формате ДНК!
Для этого разобъем 8 бит
по парам 10, 01, 00, 01
Всего пар 4, значит для
записи нам нужно будет 4 нуклеотида. Сверяясь с таблицей запишем их:
Т(10), А(01), G(00), A(01) - TAGA
Система работает в обе стороны и вы можете получить из ДНК (TAGA) байт равный 145 в любой момент.
Ну а раз мы уже смогли записать и прочесть байт, то, по той же схеме, можно записать и Гигабайт :)
Вот к примеру данная последовательность:
CGCCCCGGCTTGCTGTCTAACCGTGTGGCGCTCTTCCCCCGTGAGTGGC
GTTCTGGCTTTGTGGCTAGCTAACTTCCTGGGCCCGGCAGGTTCGAGCT
GGCTGTCTCACTCTGTGGCCGTCCTCGTGGCTCGCTCACTAAGTGGCTC
ACTAAGTGGCTCCCTTGCCGACTGGCTTCCTGGGTCTGGGGGGGG
Преобразовав эту запись методом нуклеографического алгоритма вы получите:
Думаю ваши друзя сильно удивились и долго думали, если бы вы послали им Е-mail в ДНК формате :)) При этом, если синтезировать ДНК с данной записью, то она была бы в длину около 700 Ангстрем, что гораздо меньше любой бактерии или вируса! Это была бы запись на молекулярном уровне!"Привет Оля!"
"Как дела?"
"Давно ты мне не писала"
(Другие примеры и файлы в разделе Download)
Теперь, я думаю, понятно, что "биоорганическая" ДНК и цифровой формат записи данных не так сильно различаются. Во всяком случае данные и там и там можно привести к битам, минимальным порциям информации, нулям и единицам.
Вот, в принципе, и все.
Остальное, как говорится, дело техники.
Я реализовал его на языке Visual
Basic 5.
Рабочая часть выглядит следующим образом.
(Исходный текст процедуры считывания с ДНК)
Private Sub TF()
If G(1) = "A" Then B1 = 0: B2 = 1
If G(1) = "T" Then B1 = 1: B2 = 0
If G(1) = "C" Then B1 = 1: B2 = 1
If G(1) = "G" Then B1 = 0: B2 = 0
U = U + (128 * B1) + (64 * B2)
If G(2) = "A" Then B1 = 0: B2 = 1
If G(2) = "T" Then B1 = 1: B2 = 0
If G(2) = "C" Then B1 = 1: B2 = 1
If G(2) = "G" Then B1 = 0: B2 = 0
U = U + (32 * B1) + (16 * B2)
If G(3) = "A" Then B1 = 0: B2 = 1
If G(3) = "T" Then B1 = 1: B2 = 0
If G(3) = "C" Then B1 = 1: B2 = 1
If G(3) = "G" Then B1 = 0: B2 = 0
U = U + (8 * B1) + (4 * B2)
If G(4) = "A" Then B1 = 0: B2 = 1
If G(4) = "T" Then B1 = 1: B2 = 0
If G(4) = "C" Then B1 = 1: B2 = 1
If G(4) = "G" Then B1 = 0: B2 = 0
U = U + (2 * B1) + (1 * B2)
Put 1, F, U
U = 0: F = F + 1
End Sub
(Исходный текст процедуры записи на ДНК)
Private Sub DSC()
For i = 1 To 24
B(i) = 0
Next i
For i = 0 To 2
n = Int(m(i + 1) / 128)
If n = 1 Then m(i + 1) = m(i + 1) - 128:
B(i * 8 + 1) = True
n = Int(m(i + 1) / 64)
If n = 1 Then m(i + 1) = m(i + 1) - 64:
B(i * 8 + 2) = True
n = Int(m(i + 1) / 32)
If n = 1 Then m(i + 1) = m(i + 1) - 32:
B(i * 8 + 3) = True
n = Int(m(i + 1) / 16)
If n = 1 Then m(i + 1) = m(i + 1) - 16:
B(i * 8 + 4) = True
n = Int(m(i + 1) / 8)
If n = 1 Then m(i + 1) = m(i + 1) - 8:
B(i * 8 + 5) = True
n = Int(m(i + 1) / 4)
If n = 1 Then m(i + 1) = m(i + 1) - 4:
B(i * 8 + 6) = True
n = Int(m(i + 1) / 2)
If n = 1 Then m(i + 1) = m(i + 1) - 2:
B(i * 8 + 7) = True
n = Int(m(i + 1) / 1)
If n = 1 Then B(i * 8 + 8) = True
Next i
For i = 1 To 24 Step 2
If B(i) = False And B(i + 1) = True Then
A = A + "A": GoTo 20
If B(i) = True And B(i + 1) = False Then
A = A + "T": GoTo 20
If B(i) = True And B(i + 1) = True Then
A = A + "C": GoTo 20
If B(i) = False And B(i + 1) = False Then
A = A + "G": GoTo 20
20 Next i
Put 2, F, A
F = F + 12
A = ""
End Sub
А вот алгоритм, предложенный Назаровым Иваном...
( IvanNazaroff@Rambler.ru )
Attribute VB_Name = "DnaCoding"
Option Explicit
Private Const ANucleotid = "01", TNucleotid = "10"
Private Const GNucleotid = "00", CNucleotid = "11"
Public Function BinToDec(BinValue As String) As
Byte
Dim i As Integer
For i = 1 To Len(BinValue)
If Mid(BinValue, i, 1) = "1"
Then
BinToDec = BinToDec
+ 2 ^ (Len(BinValue) - i)
End If
Next i
End Function
Public Function DecToBin(DecValue As Byte) As String
Dim i As Integer
For i = 7 To 0 Step -1
If Int(DecValue / 2 ^ i) = 1
Then
DecToBin = DecToBin
& "1"
DecValue = DecValue
- 2 ^ i
Else
DecToBin = DecToBin
& "0"
End If
Next i
End Function
Public Function DNAEncodeFromString(StrArg As String)
As String
Dim BinaryChar As String, TmpString As String, i
As Long
For i = 1 To Len(StrArg)
BinaryChar = BinaryChar &
DecToBin(Asc(Mid(StrArg, i, 1)))
Next i
For i = 1 To Len(BinaryChar) Step 2
Select Case Mid(BinaryChar, i,
2)
Case Is = ANucleotid
TmpString
= TmpString & "a"
Case Is = TNucleotid
TmpString
= TmpString & "t"
Case Is = GNucleotid
TmpString
= TmpString & "g"
Case Is = CNucleotid
TmpString
= TmpString & "c"
End Select
Next i
DNAEncodeFromString = UCase(TmpString)
End Function
Public Function DNADecodeToString(CharStr As String)
As String
Dim BinaryChar As String, FinalStr As String, i
As Long
For i = 1 To Len(CharStr)
Select Case LCase(Mid(CharStr,
i, 1))
Case Is = "a"
BinaryChar
= BinaryChar & ANucleotid
Case Is = "t"
BinaryChar
= BinaryChar & TNucleotid
Case Is = "g"
BinaryChar
= BinaryChar & GNucleotid
Case Is = "c"
BinaryChar
= BinaryChar & CNucleotid
End Select
Next i
For i = 1 To Len(BinaryChar) Step 8
FinalStr = FinalStr & Chr(BinToDec(Mid(BinaryChar,
i, 8)))
Next i
DNADecodeToString = FinalStr
End Function