Advertisement
Guest User

Task #1

a guest
Dec 6th, 2014
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.66 KB | None | 0 0
  1. package ru.niner
  2.  
  3. import java.nio.file.{Paths, Files}
  4.  
  5.  
  6. object TaskOne extends App {
  7.   // считываем последовательность байт из файла
  8.   val data : Array[Byte] = Files.readAllBytes(Paths.get("plrabn12.txt"))
  9.   println(data.length)
  10.   // для длин последовательностей от 1 до 4
  11.   for (length <- 1 to 4) {
  12.     var freq = Map[Int,Int]()
  13.     for (pos <- 0 to data.length - length) {
  14.       // считаем число вхождений бита
  15.       val value = compute(data,pos,length)
  16.       val oldFreq = if (freq.contains(value)) freq(value) else 0
  17.       freq += (value -> (oldFreq + 1))
  18.     }
  19.     val e0 = entropyJustOccured(freq,data.length - length + 1) / length
  20.     val e1 = entropyAllAlphabet(freq,data.length - length + 1,length) / length
  21.  
  22.     println(length + " " + e0 + " " + e0 * data.length / 8 + " " + e1 + " " + e1 * data.length / 8)
  23.   }
  24.  
  25.   // энтропия при учете только возникших
  26.   def entropyJustOccured(freq : Map[Int, Int], n : Int): Double = {
  27.     var entropy = 0.0
  28.     for ((key, value) <- freq) {
  29.       val prob = (1.0 * value)/n
  30.       entropy += prob * (Math.log(prob) / Math.log(2))
  31.     }
  32.     -entropy
  33.   }
  34.  
  35.   // энтропия при учете всего алфавита
  36.   def entropyAllAlphabet(freq : Map[Int, Int], n : Int, length : Int): Double = {
  37.     var entropy = 0.0
  38.     var count = Math.pow(256, length)
  39.     var overall = 0.0
  40.     // вошедшие буквы
  41.     for ((key,value) <- freq) {
  42.       count -= 1
  43.       var prob = 1.0 * value / n
  44.       // нормировка
  45.       prob *= 1 / (1+(Math.pow(256,length) - freq.size)/Math.pow(256,length))
  46.       //val prob = 1.0 * (value / Math.pow(n,length)) / Math.pow(256,length)
  47.       overall += prob
  48.       entropy += prob * (Math.log(prob) / Math.log(2))
  49.     }
  50.     // суммарная вероятность для появившихся букв
  51.     println(overall)
  52.     // Невошедшие буквы
  53.     while (count > 0) {
  54.       count -= 1
  55.       //val prob = 1.0 / (freq.size * Math.pow(256,length))
  56.       var prob = 1.0 / Math.pow(256,length)
  57.       // нормировка
  58.       prob *= 1 / (1+(Math.pow(256,length) - freq.size)/Math.pow(256,length))
  59.       entropy += prob * (Math.log(prob) / Math.log(2))
  60.       overall += prob
  61.     }
  62.     // суммарная вероятность для всех (должны быть равна единице)
  63.     println(overall)
  64.     -entropy
  65.   }
  66.  
  67.   def compute(data : Array[Byte], pos : Int, length : Int): Int = {
  68.     var res = 0
  69.     for (i <- 0 until length) {
  70.       res = res * 256 + data(pos+i)
  71.     }
  72.     res
  73.   }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement