Lisp Peaks
(defun peaks (a)
  (let ((n (length a)))
    (if (<= n 2)
        0
        (let* ((vec (coerce a 'vector))
               (sum (make-array n :initial-element 0))
               (last -1)
               (dist 0))
          (loop for i from 1 below (1- n)
                do (progn
                     (setf (aref sum i) (aref sum (1- i)))
                     (when (and (> (aref vec i) (aref vec (1- i)))
                                (> (aref vec i) (aref vec (1+ i))))
                       (setf dist (max dist (- i last)))
                       (setf last i)
                       (incf (aref sum i)))))
          (setf (aref sum (1- n)) (aref sum (- n 2)))
          (if (zerop (aref sum (1- n)))
              0
              (progn
                (setf dist (max dist (- n last)))
                (loop for i from (1+ (ash dist -1)) below dist
                      do (when (zerop (mod n i))
                           (let ((lst 0)
                                 (j i))
                             (loop while (<= j n)
                                   do (if (<= (aref sum (1- j)) lst)
                                          (return)
                                          (progn
                                            (setf lst (aref sum (1- j)))
                                            (incf j i))))
                             (when (> j n)
                               (return-from peaks (floor n i))))))
                (setf last dist)
                (loop while (/= 0 (mod n last))
                      do (incf last))
                (floor n last)))))))

This finds the peak positions, then tests how many equal blocks can each contain at least one peak.