Принцип метода нуклеографии

Все дело в нуклеотидах. Их последовательное соединение в цепочке ДНК определяет всю информацию. А чем, скажете вы, это может быть похоже на биты, байты, вобщем на Данные?  Все очень просто! Принцип комплементарности (дополнения) - основа ДНК. Нуклеотиды соединены парами А-Т  и G-C то есть напротив Аденина(А) всегда Тимин(Т), напротив Гуанина(G) всегда будет стоять Цитозин(C). Это означает, что противоположная цепочка ДНК будет копией своей второй цепи, только инвертированной! Таким образом Т - инверсия от А, С инверсия от G. Как 0 и 1, 1 и 0.
Просто? Почти! Да только пары АТ и GC нельзя расматривать как биты, их нужно рассматривать как пару бит! А = 01(binary) и комплементарный ему Т = 10, G = 00 и С = 11
 
 

Название нуклеотида Кодовое сокращение Двоичный эквивалент
Гуанин
G
00
Аденин
A
01
Тимин
T
10
Цитозин
C
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

Hosted by uCoz