CS30 - Spring 2016 - Class 24

Lecture notes

  • admin
       - assignment 10
          - remember, will use many different starting piles (all with 4 piles, though)

       - NIM tournament in class next Tuesday

  • number representation
       - when you type:

          >> x = 17
       
          how does the computer actually store this information, specifically the number 17?

       - if you look far enough down into the details of what's going on when you run your computer, almost everything is represented using binary, i.e. some combination of 1's and 0's
       - why binary?
          - a combination of ease of use and cost
          - basic idea: "1" electrical current is flowing, "0" current is not flowing
          - transistors can do built to do this efficiently, cheaply and at a extremely small scale
          - could do other representations, but this is what is most effective right now... (and has been for a long time)
       
  • decimal numbers
       - most commonly used number systems have a "base"
          - each digit in the number can range from 0...base-1
          - each digit in the number has an index, starting at the right-most digit with 0 and working up to the left
          - the contribution of the digit is:

             base^index * value

          - by summing up the contribution of all of the digits, we get the value of the number
       
       - what is the base for our numbering system?
          - 10

          - for example
             - 245 = 5*10^0 + 4*10^1 + 2*10^2
             - 80498 = 8*10^0 + 9*10^1 + 4*10^2 + 0*10^3 + 8*10^4

  • binary numbers
       - we can represent numbers using any base we want
       - binary numbers are numbers represented as base 2
          - digits can only be a 0 or a 1

          - for example, the following binary numbers:
             - 101 = 1*2^0 + 0*2^2 + 1*2^2 = 5
             - 11 = 1*2^0 + 1*2^1 = 3
             - 10111 = 1*2^0 + 1*2^1 + 1*2^2 + 0*2^3 + 1*2^4 = 23
             - 100001 = 1*2^0 + 1*2^5 = 33

  • some number examples (DFA):
       - greater_5.jff: all numbers 5 or greater (represented as binary)

       
       - odd_number.jff: all odd numbers (represented as binary)
          - (O|1)*1


  • non-deterministic finite automata (NFA)
       - almost identical definition to DFA except:
          - for a given state and input, can go to two or more states (rather than just a single one for DFAs)
          
          - do not require that there is a transition for every alphabet letter for every state
             - if you encounter a state without a transition for a particular letter, it does not accept that path

          - can have epsilon (or sometimes called lambda) transitions from one state to another
             - doesn't read anything from the input, just transitions

          - an NFA accepts if *some* path exists (i.e. some choice of transitions) for the input that ends in a final state

       - tend to be a bit easier to work with than DFAs

       - NFA's do not actually have any more expressive power
          - in particular, for any NFA, there is a corresponding DFA that accepts the same language (i.e. same set of strings)

  • some NFA examples (found in NFA examples)
       - start_end_a (1): start and end with a
          - a(a|b)*a

       - 2_or_3_a (2): strings of a's that have lengths divisible by 2 OR 3
          - (aa)*|(aaa)*

       - end_aa (3): ends in two a's
          - (a|b)*aa

       - aa_bb (4): has either aa or bb as a substring
          - (a|b)*(aa|bb)(a|b)*

  • regular language
       - any language that can be described by a DFA (or an NFA)
       - any language that can be described by a regular expression!

  • play with JFLAP

  • design a DFA that accepts 0^n1^n
       - First hint that this is a problem is that we can't represent this as a regular expression
       - seems like we need to count the number of zeros
          - problem is we could have any number of 0s

  • turing machines
       - similar to DFAs
          - they have states with transitions defined over the alphabet
          - they have a starting state and one or more final/accepting states
       - key differences:
          - Can *write* to the input tape as well as read
          - Can move right *and* left on the input tape
          - The input tape is infinite!

  • look at the 0n1n example (found in Turing examples)
       - transitions are labeled with three things:
          1) the input character read
          2) the output character to write
          3) which way to move the head (L, R or S)

       - basic idea of this example:
          - put Xs over the 0s. For each X you put on a 0, go find the next 1 and put a Y over it
          - if you get to the point where everything is X and Y (and no 0s or 1s) you're done!

       - slightly more detailed
          - read a 0: put an X down and move right
          - keep reading 0s and Ys to the right until you find a 1
          - put a Y on that 1 and move left
          - keep reading Ys and 0s until you find an X
          - move right
          - repeat
             - if you get to a point where the first character is a Y
             - read all the Ys and move right
             - make sure that you get a blank (and not a 1 or a 0). If so, we're done!

  • look at eq1s0s (found in turing_examples)

  • look at palindrome (found in turing_examples)